按两个标准对字典列表进行排序

时间:2016-08-11 18:40:17

标签: python sorting dictionary

最近开始用python编程,我有一个问题,我无法想出答案。我有一个很大的字典列表,其中包含各种键和值(超过下面)。我想对列表中出现的词典顺序进行排序。 list_one

list_one = [{'country': 'Spain',     'id': 'v1', 'key2': 'value2'},
            {'country': 'France',    'id': 'v4', 'key2': 'value2'},
            {'country': 'China',     'id': 'v4', 'key2': 'value2'},
            {'country': 'Russia',    'id': 'v3', 'key2': 'value2'},
            {'country': 'Australia', 'id': 'v2', 'key2': 'value2'},
            {'country': 'China',     'id': 'v3', 'key2': 'value2'},
            ...
           ]

首先,排序' id'价值(v1v2v3,...)(我可以很好地解决)。

此外,如果id值相似,请根据'country'键的值进行排序。我不想按字母顺序排序。如果有意义的话,我希望能够根据设置给这些国家/地区的值进行排序。例如,France = 1China = 2Australia = 3Spain = 4Russia = 5

字典的顺序应该像第二个那样 例。 list_two

[{'country': 'Spain',     'id': 'v1', 'key2': 'value2'},
 {'country': 'Australia', 'id': 'v2', 'key2': 'value2'},
 {'country': 'China',     'id': 'v3', 'key2': 'value2'},
 {'country': 'Russia',    'id': 'v3', 'key2': 'value2'},
 {'country': 'France',    'id': 'v4', 'key2': 'value2'},
 {'country': 'China',     'id': 'v4', 'key2': 'value2'}
 ...
]

是否有一种pythonic方法可以对这些词组在列表中出现的顺序进行排序,首先是“&id”标识的值。密钥,如下所示,然后是一些隐含的值'设置国家?

list_two = sorted(list_one, key=lambda k: k['id'])

1 个答案:

答案 0 :(得分:3)

生成字典映射国家/地区名称到订单号:

country_ordering = {'France': 1, 'China': 2, 'Australia': 3,
                    'Spain': 4, 'Russia': 5}

然后在排序键中使用它,返回带有id的元组和该映射中的值:

list_two = sorted(
    list_one, 
    key=lambda k: (k['id'], country_ordering.get(k['country'], float('inf')))

我使用dict.get()方法查找排序值;这样你可以指定一个默认值,以防映射中列出的国家(还没有?)。上面我使用float('inf') infinity )作为默认值,这意味着任何此类不公开的国家/地区都会在最后排序(按照给定的id)。

如果您想要抛出异常,请将lambda更改为:

lambda k: (k['id'], country_ordering[k['country']])

进行直接键查找。

演示:

>>> list_one = [{'country': 'Spain',     'id': 'v1', 'key2': 'value2'},
...             {'country': 'France',    'id': 'v4', 'key2': 'value2'},
...             {'country': 'China',     'id': 'v4', 'key2': 'value2'},
...             {'country': 'Russia',    'id': 'v3', 'key2': 'value2'},
...             {'country': 'Australia', 'id': 'v2', 'key2': 'value2'},
...             {'country': 'China',     'id': 'v3', 'key2': 'value2'}]
>>> country_ordering = {'France': 1, 'China': 2, 'Australia': 3, 'Spain': 4, 'Russia': 5}
>>> sorted(list_one, key=lambda k: (k['id'], country_ordering[k['country']]))
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'}, {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, {'country': 'China', 'id': 'v3', 'key2': 'value2'}, {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, {'country': 'France', 'id': 'v4', 'key2': 'value2'}, {'country': 'China', 'id': 'v4', 'key2': 'value2'}]
>>> pprint(_)
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'},
 {'country': 'Australia', 'id': 'v2', 'key2': 'value2'},
 {'country': 'China', 'id': 'v3', 'key2': 'value2'},
 {'country': 'Russia', 'id': 'v3', 'key2': 'value2'},
 {'country': 'France', 'id': 'v4', 'key2': 'value2'},
 {'country': 'China', 'id': 'v4', 'key2': 'value2'}]