基于2个键的值排序python词典列表

时间:2014-03-16 10:28:57

标签: python sorting dictionary

我有一个字典列表,我想根据键索引的值来排序'只要另一个叫做“验证者”的密钥。等于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}]

列表首先按密钥验证者排序,然后按密钥索引

排序

感谢您的帮助!!!

1 个答案:

答案 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的项目在开始时排序,因为FalseTrue之前排序。如果要反转该顺序,请使用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}}