2

我有这个清单:

L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]

如何按country(或按status)元素、ASC/DESC 对该列表进行排序。

4

3 回答 3

9

用于list.sort()对列表进行就地排序或sorted获取新列表:

>>> L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]
>>> L.sort(key= lambda x:x['country'])
>>> L
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]

您可以将可选的关键字参数reverse = True传递给sort并按sorted降序排序。

由于大写字母被认为小于其相应的小写版本(由于它们的 ASCII 值),因此您可能也必须使用str.lower

>>> L.sort(key= lambda x:x['country'].lower())
>>> L
[{'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'France'}, {'status': 1, 'country': 'usa'}]
于 2013-05-14T09:45:59.617 回答
7
>>> from operator import itemgetter
>>> L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]
>>> sorted(L, key=itemgetter('country'))
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]
>>> sorted(L, key=itemgetter('country'), reverse=True)
[{'status': 1, 'country': 'usa'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'France'}]
>>> sorted(L, key=itemgetter('status'))
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}]
于 2013-05-14T09:45:59.697 回答
2

对于真正的代码来说,将密钥拉出一个命名函数是一个好主意,因为现在您可以显式地为它编写测试

def by_country(x):
    # For case insensitive ordering by country
    return x['country'].lower()

L.sort(key=by_country)

当然你可以适应使用sorted(L, key=...)等等reverse=True

于 2013-05-14T10:11:19.013 回答