[英]sort python list of dictionaires based on value of 2 keys
我有一个字典列表,我想根据一个键“索引”的值对它进行排序,只要另一个称为“验证程序”的键等于1。这两个键都存在于列表中的所有字典中
我可以使用下面的代码对列表进行排序...但是不确定如何添加其他条件(我宁愿不先过滤列表,因为我需要所有字典,即使那些字典与关键字“验证者”不匹配也是如此) 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}]
该列表首先按密钥验证者排序,然后按密钥索引排序
谢谢您的帮助!!!
键函数可以返回一个元组的排序键; 当元组中的第一个值等于两个值时,比较元组中的第二项,依此类推:
product_list = sorted(product_list, key=lambda k: (k['verifier'] == 1, k['index']))
这将返回一个(boolean, k['index'])
元组,将所有值分组为k['verifier']
等于或不等于1。 k['verifier'] != 1
项目在开始时进行排序,因为False
在True
之前进行排序。 如果要反转顺序,请使用k['verifier'] != 1
。
或者,对于k['verifier'] != 1
项目,您可以返回None
:
product_list = sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else None)
,这会将您的项目再次分组为将verifier
设置为1
和未将verifier
设置为1
的项目,但不会进一步对项目k['verifier'] != 1
进行排序。 在Python 2中,始终None
首先排序None
,因此所有具有k['verifier'] != 1
都将被分组在列表的最前面。 如果所有k['index']
值都是数字,则使用float('inf')
代替None
如果应该倒数第二个),则应使用None
。
用一小段演示数据最容易说明这一点:
>>> 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
列表项的原始顺序保留在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}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.