根据两个键的值排序 Python 字典列表

0 投票
1 回答
675 浏览
提问于 2025-04-17 22:31

我有一个字典的列表,我想根据一个叫做 '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 个回答

2

关键函数可以返回一个包含排序关键字的元组;当元组中的第一个值对于两个值相等时,就会比较元组中的第二个值,以此类推:

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}]

撰写回答