2014-03-29 28 views
0

排序列表的列表可以說我有以下Python列表:的Python:用字符串元素

mylist = [ 
    ["name_a", "sex_male", "age_15", "grade_11"], 
    ["name_b", "sex_male", "age_18", "grade_9"], 
    ["name_c", "sex_male", "age_11", "grade_8"], 
    ["name_d", "sex_male", "age_16", "grade_12"], 
    ["name_e", "sex_male", "age_19", "grade_13"], 
] 

我想打電話給Python的sort()函數由年齡排序MYLIST

舉例來說,我想要做這樣的事情:

mylist.sort(key=...) 

得到輸出

mylist = [ 
    ["name_c", "sex_male", "age_11", "grade_8"], 
    ["name_a", "sex_male", "age_15", "grade_11"], 
    ["name_d", "sex_male", "age_16", "grade_12"], 
    ["name_b", "sex_male", "age_18", "grade_9"], 
    ["name_e", "sex_male", "age_19", "grade_13"], 
] 

什麼是做到這一點的正確方法?

P.S

一個問題:爲什麼排序算法是Python的sort()函數使用? (例如快速排序?)

+0

可能重複[在Python中,我如何根據字典的值對字典列表進行排序?](http://stackoverflow.com/questions/72899/in-python-how-do-i-按字典值排序字典列表) – shx2

+0

編寫一個函數,從一個項目中提取年齡。用它作爲關鍵功能。這是優於使用任何超過簡單的情況下,更多的是拉姆達,因爲這樣你可以編寫該函數的單元測試。 –

回答

1

假設所有年齡看起來是一樣的,你可以這樣做:

>>>mylist.sort(key=lambda e: int(e[2].split('_')[1])) 
[['name_c', 'sex_male', 'age_11', 'grade_8'], 
['name_a', 'sex_male', 'age_15', 'grade_11'], 
['name_d', 'sex_male', 'age_16', 'grade_12'], 
['name_b', 'sex_male', 'age_18', 'grade_9'], 
['name_e', 'sex_male', 'age_19', 'grade_13']] 

lambda表達只是通過在_字符分割字符串轉換爲int的解析年齡場分裂的第二個元素的結果。

Python使用TimSort算法,這是一種由Tim Peters創建的針對Python的定製搜索算法。

+0

請注意,OP要使用'mylist.sort(key = ...)' – Christian

+1

@Christian權利,我只是習慣'排序',我會編輯,謝謝:) –

2
def extract_age(item): 
    """age is stored in the 3rd element of item. eg. 
     ['name_c', 'sex_male', 'age_11', 'grade_8'] 
     and should be returned as an int 
    """ 
    return int(item[2].split('_')[1]) 

mylist.sort(key=extract_age) 
+0

+1雖然可能lambda是更多pythonic,[_愚蠢的一致性是小心靈的大地精_](http://legacy.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-頭腦)和年齡提取功能是非常值得的測試它。你爲什麼不把你的評論包含在答案中?是一個很好的動機。 –