最近开始用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'价值(v1
,v2
,v3
,...)(我可以很好地解决)。
此外,如果id
值相似,请根据'country'
键的值进行排序。我不想按字母顺序排序。如果有意义的话,我希望能够根据设置给这些国家/地区的值进行排序。例如,France = 1
,China = 2
,Australia = 3
,Spain = 4
,Russia = 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'])
答案 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'}]