我有一个列表列表,每个列表都包含一个字典。我想根据我的字典中的一个键对列表进行排序。
[[], [{'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'}]]
我想根据“已删除”键对其进行排序。任何想法
答案 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}]]