我有一个字典列表,我想根据键索引的值来排序'只要另一个叫做“验证者”的密钥。等于1.两个键都出现在列表中的所有词典中
我可以使用下面的代码对列表进行排序......但不确定如何添加其他条件(我不希望之前过滤列表,因为我需要所有词典,甚至是那些与键不匹配的词典#39;验证者' = 1条件)
product_list = sorted(product_list, key=lambda k: k['index'])
提前感谢您的帮助......
我的字典就像下面的字典......
product_list=[{'index':1,'key1':'xxx','key2':'xxx','verifier':0},{'index':2,'key1':'xxx','key2':'xxx','verifier':1},{'index':3,'key1':'xxx','key2':'xxx','verifier':0},{'index':4,'key1':'xxx','key2':'xxx','verifier':1}]
我想回复一下:
product_list=[{'index':2,'key1':'xxx','key2':'xxx','verifier':1},{'index':4,'key1':'xxx','key2':'xxx','verifier':1},{'index':1,'key1':'xxx','key2':'xxx','verifier':0},{'index':3,'key1':'xxx','key2':'xxx','verifier':0}]
列表首先按密钥验证者排序,然后按密钥索引
排序感谢您的帮助!!!
答案 0 :(得分:1)
键功能可以返回排序键的元组;当元组中的第一个值对于两个值相等时,将比较元组中的第二个项,等等:
product_list = sorted(product_list, key=lambda k: (k['verifier'] == 1, k['index']))
这将返回一个(boolean, k['index'])
元组,将k['verifier']
的所有值分组为1或不等于1。 k['verifier'] != 1
的项目在开始时排序,因为False
在True
之前排序。如果要反转该顺序,请使用k['verifier'] != 1
。
或者,您可以为None
:
k['verifier'] != 1
product_list = sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else None)
这将再次将您的商品分组为verifier
设置为1
的商品和不属于k['verifier'] != 1
的商品,但不会对商品None
进行进一步排序。在Python 2中,k['verifier'] != 1
始终排在第一位,因此float('inf')
的所有项都将分组在列表的前面。如果所有None
值均为数字,则应使用k['index']
代替>>> product_list = [{'index': 12, 'verifier': 1}, {'index': 3, 'verifier': 0}, {'index': 9, 'verifier': 1}, {'index': 2, 'verifier': 0}]
>>> sorted(product_list, key=lambda k: (k['verifier'] == 1, k['index']))
[{'index': 2, 'verifier': 0}, {'index': 3, 'verifier': 0}, {'index': 9, 'verifier': 1}, {'index': 12, 'verifier': 1}]
>>> sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else None)
[{'index': 3, 'verifier': 0}, {'index': 2, 'verifier': 0}, {'index': 9, 'verifier': 1}, {'index': 12, 'verifier': 1}]
,而不是else None
。
使用一小组演示数据可以很容易地说明这一点:
k['verifier'] != 1
两种排序之间的区别在于前两个项目以>>> sorted(product_list, key=lambda k: (k['verifier'] != 1, k['index']))
[{'index': 9, 'verifier': 1}, {'index': 12, 'verifier': 1}, {'index': 2, 'verifier': 0}, {'index': 3, 'verifier': 0}]
>>> sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else float('inf'))
[{'index': 9, 'verifier': 1}, {'index': 12, 'verifier': 1}, {'index': 3, 'verifier': 0}, {'index': 2, 'verifier': 0}]
排序的原始列表顺序保留。最后对{{1}}项进行分组:
{{1}}