Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据2个键的值对词典列表进行排序_Python_Sorting_Dictionary - Fatal编程技术网

Python 根据2个键的值对词典列表进行排序

Python 根据2个键的值对词典列表进行排序,python,sorting,dictionary,Python,Sorting,Dictionary,我有一个字典列表,只要另一个名为“verifier”的键等于1,我就会根据键“index”的值对其进行排序。这两个键都存在于列表中的所有词典中 我可以用下面的代码对列表进行排序。。。但不确定如何添加另一个条件(我不希望在之前过滤列表,因为我需要所有字典,即使那些与键“verifier”=1条件不匹配的字典) 提前感谢您的帮助 我的字典和下面的一样 product_list=[{'index':1,'key1':'xxx','key2':'xxx','verifier':0},{'index':2

我有一个字典列表,只要另一个名为“verifier”的键等于1,我就会根据键“index”的值对其进行排序。这两个键都存在于列表中的所有词典中

我可以用下面的代码对列表进行排序。。。但不确定如何添加另一个条件(我不希望在之前过滤列表,因为我需要所有字典,即使那些与键“verifier”=1条件不匹配的字典)

提前感谢您的帮助

我的字典和下面的一样

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}]
首先按键验证器排序,然后按键索引排序的列表


谢谢你的帮助

key函数可以返回排序键的元组;当元组中的第一个值与两个值相等时,将比较元组中的第二项,以此类推:

product_list = sorted(product_list, key=lambda k: (k['verifier'] == 1, k['index']))
这将返回一个
(布尔值,k['index'])
元组,将所有值分组为
k['verifier']
是否等于1。带有
k['verifier']的项目!=1
在开头排序,因为
False
True
之前排序。使用
k['verifier']!=1
如果要颠倒顺序

或者,对于
k['verifier']=1

product_list = sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else None)
这将再次将您的项目分为
verifier
设置为
1
的项目和未设置为
1
的项目,但不会对项目进一步排序
k['verifier'!=1
。在Python2中,
None
总是先排序,所以所有带有
k['verifier']的项都是1
将分组在列表的前面。如果所有的
k['index']
值都是数值,则应使用
float('inf')
而不是
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
排序中按原始列表顺序保留。对
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}]

带有
'verifier'的项目应该放在哪里!=1
要排序吗?开始还是结束?提供排序前后数据的实际示例可能会有所帮助。感谢您的回复。。。我尝试了两种选择,但似乎都不起作用。。。字典仍然是按索引键排序的。。。我会编辑这篇文章来澄清一下…@Martjin:你的代码很好,错误在我代码的其他地方。。。你知道当我把这个字典列表从一个函数传递到另一个函数时,它可能会改变列表的顺序吗;你知道这里有什么不同吗?一个选项对两个组进行排序,另一个选项将未验证的项目保留为原始顺序,但分组到一边。您可以就地排序吗?使用
list.sort()
而不是
sorted()
。谢谢Martjin,我理解了示例,非常清楚。。。我正在寻找您描述的第一个选项(先按键1排序,然后按键2排序)。我将尝试使用列表。排序。。。再次感谢!!!
>>> 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}]