2016-12-14 45 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'已被弃用。使用'键' –