Python:排序字典列表

时间:2014-04-03 10:10:00

标签: python sorting dictionary

我有一个列表列表,每个列表都包含一个字典。我想根据我的字典中的一个键对列表进行排序。

[[], [{'ceph_pk': 8L, 'deleted': False, 'user_key': u'landesk522_8', 'ceph_detail_id': 8L, 'account_title': u'logger test'}], [{'ceph_pk': 7L, 'deleted': True, 'user_key': u'landesk522_7', 'ceph_detail_id': 7L, 'account_title': u'test new'}]]

我想根据“已删除”键对其进行排序。任何想法

3 个答案:

答案 0 :(得分:0)

Sort函数接受一个键和cmp函数来定义元素的排序方式,我认为最容易使用比较函数。您可以根据需要进行调整。

lst = [[], [{'ceph_pk': 8L, 'deleted': False, 'user_key': u'landesk522_8', 'ceph_detail_id': 8L, 'account_title': u'logger test'}], [{'ceph_pk': 7L, 'deleted': True, 'user_key': u'landesk522_7', 'ceph_detail_id': 7L, 'account_title': u'test new'}]]

def compare_list(l1, l2):
    if l2 is None or len(l2) == 0:
        return 1
    if l1 is None or len(l1) == 0:
        return -1
    return cmp(l1[0].get('deleted', False), l2[0].get('deleted', False))

lst.sort(cmp=compare_list)
print lst

返回:

[[], 
[{'deleted': False, 'user_key': u'landesk522_8', 'account_title': u'logger test',
'ceph_detail_id': 8L, 'ceph_pk': 8L}], 
[{'deleted': True, 'user_key': u'landesk522_7', 'account_title': u'test new', 
'ceph_detail_id': 7L, 'ceph_pk': 7L}]]

答案 1 :(得分:0)

首先,从列表中删除空列表。然后,使用key参数指定应如何进行排序。 key接受一个函数,该函数应该返回要在排序中使用的值。语法是

sorted(yourList, key=func)

func将从列表中的每个项目作为参数接收。因此,如果func收到列表,您如何返回deleted键的值?

修改:由于您提到希望'deleted':True成为第一位,因此您应该使用reverse=True上的sorted参数,即sorted(yourList, key=func, reverse=True)

答案 2 :(得分:0)

如果你想使用itemgetter,你需要过滤掉空列表,并从嵌套列表中提取词干

>>> L = [[], [{'ceph_pk': 8L, 'deleted': False, 'user_key': u'landesk522_8', 'ceph_detail_id': 8L, 'account_title': u'logger test'}], [{'ceph_pk': 7L, 'deleted': True, 'user_key': u'landesk522_7', 'ceph_detail_id': 7L, 'account_title': u'test new'}]]
>>> from operator import itemgetter
>>> sorted((x[0] for x in L if x), key=itemgetter('deleted'))
[{'deleted': False, 'user_key': u'landesk522_8', 'account_title': u'logger test', 'ceph_detail_id': 8L, 'ceph_pk': 8L}, {'deleted': True, 'user_key': u'landesk522_7', 'account_title': u'test new', 'ceph_detail_id': 7L, 'ceph_pk': 7L}]

如果您需要保留空列表和/或额外的嵌套级别,则应使用key函数(优先于cmp函数)

>>> def key_func(item):
...     return item[0]['deleted'] if item else 0
... 
>>> sorted(L, key=key_func)
[[], [{'deleted': False, 'user_key': u'landesk522_8', 'account_title': u'logger test', 'ceph_detail_id': 8L, 'ceph_pk': 8L}], [{'deleted': True, 'user_key': u'landesk522_7', 'account_title': u'test new', 'ceph_detail_id': 7L, 'ceph_pk': 7L}]]