繁体   English   中英

根据2个键的值对字典的python列表进行排序

[英]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项目在开始时进行排序,因为FalseTrue之前进行排序。 如果要反转顺序,请使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM