根据两个键的值排序 Python 字典列表
我有一个字典的列表,我想根据一个叫做 'index' 的键的值来排序,只要另一个叫 'verifier' 的键等于 1。所有字典中都有这两个键。
我可以用下面的代码来排序……但我不太确定怎么加上另一个条件(我希望不先过滤列表,因为我需要所有的字典,即使有些字典的 'verifier' 不等于 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}]
这个列表先按 'verifier' 键排序,然后再按 'index' 键排序。
谢谢你的帮助!!!
1 个回答
关键函数可以返回一个包含排序关键字的元组;当元组中的第一个值对于两个值相等时,就会比较元组中的第二个值,以此类推:
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
的项目返回 None
:
product_list = sorted(product_list, key=lambda k: k['index'] if k['verifier'] == 1 else None)
这样做同样会把你的项目分成那些 verifier
设置为 1
的和那些没有设置的,但不会进一步对 k['verifier'] != 1
的项目进行排序。在 Python 2 中,None
总是排在最前面,所以所有 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}]