2016-12-14 76 views
0

說我有這樣類型的字典列表:在python自定義排序詞典列表

sizes = [ 
    { 
     'doc_count': 86, 
     'key': 'M' 
    }, 
    { 
     'doc_count': 85, 
     'key': 'XL' 
    }, 
    { 
     'doc_count': 84, 
     'key': 'L' 
    }, 
    { 
     'doc_count': 84, 
     'key': 'XXL' 
    }, 
    { 
     'doc_count': 66, 
     'key': 'S' 
    }, 
    { 
     'doc_count': 66, 
     'key': 'XXXL' 
    } 
] 

什麼會根據預先定義的列表進行排序它最有效的方法:'S''M''L''XL''XXL'? (也許是更多的「排序」比排序)

我知道我可以這樣做:

new_list = [] 
size_map = ['S','M','L','XL','XXL','XXXL'] 
for size in size_map: 
    for i in range(len(sizes)): 
     if size in sizes[i].values(): 
      new_list.append({ 'key': size, 'doc_count': sizes[i]['doc_count'] }) 

但我不知道是否有更好的方法。嘗試修改一些列表理解,但我還沒有得到任何工作。任何想法讚賞!

+0

看看這個小提琴是否適合您的需求 - https://repl.it/Epi9 – marmeladze

+0

這個效果很好!謝謝你這樣做 – tarponjargon

回答

3

對於整理列表,我建議使用內置的sorted()函數或列表方法list.sort()。要指定一個非標準的排序順序,使用key=關鍵字:

size_map = {'S':1,'M':2,'L':3,'XL':4,'XXL':5,'XXXL':6} 
new_list = sorted(sizes, key=lambda x:size_map[x['key']]) 

或者,你可以使用你原來的size_map列表索引作爲排序關鍵字:

size_map = ['S','M','L','XL','XXL','XXXL'] 
new_list = sorted(sizes, key=lambda x:size_map.index(x['key'])) 

但是,對於足夠大size_map陣列,使用dict會走得更快。

注意the Python documentation鼓勵使用的key=代替cmp=

一般而言,keyreverse轉換過程是不是指定的等效cmp功能快得多。

+0

超酷!謝謝! – tarponjargon

0

你必須定義一個比較函數並調用排序()是這樣的:

sorted_sizes = sorted(sizes, cmp=compFunc) 

compFunc()可能是這樣的:

def compFunc(item1, item2) : 
    size_map = ['S', 'M', 'L', 'XL', 'XXL', 'XXXL'] 
    if size_map.index(item1['key']) > size_map.index(item2['key']) : 
     return 1 
    elif size_map.index(item1['key']) < size_map.index(item2['key']) : 
     return -1 
    else : 
     return 0 

對於內置的分類功能()請參見here

+0

'cmp'已被棄用。使用'鍵' –