在python

时间:2016-12-14 07:12:19

标签: python sorting dictionary

说我有一个像这样的词典列表:

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'] } )

但我想知道是否有更好的方法。尝试修改一些列表理解,但我还没有得到任何工作。任何想法都赞赏!

2 个答案:

答案 0 :(得分: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函数要快得多。

答案 1 :(得分:0)

您必须定义比较函数并调用sorted(),如下所示:

whereRaw

compFunc()可能是这样的:

sorted_sizes = sorted( sizes, cmp=compFunc ) 

对于内置函数 sorted(),请参阅here