按多个项目对字典列表进行排序,每个项目使用不同的反向值

时间:2019-03-14 19:52:22

标签: python

我有以下对象列表,我想对它们进行排序,使得所有带有k2 == True的字典(按字母顺序排列的A-Z),然后所有带有k2 == False的字典(按字母顺序排列的A-Z)。 我尝试了类似sorted(test, key=lambda k: (k['k2'], k['k1'].lower()), reverse=(True,False))的方法,但是没有用。

>>> test = [
...     {"k1": "qsd", "k2": True},
...     {"k1": "JKd", "k2": False},
...     {"k1": "Ukz", "k2": False},
...     {"k1": "aqd", "k2": True},
...     {"k1": "Asd", "k2": True},
...     {"k1": "wef", "k2": False},
...     {"k1": "Wgr", "k2": True},
...     {"k1": "weg", "k2": False},
...     {"k1": "lfe", "k2": True},
... ]
>>>
>>> test = sorted(test, key=lambda k: (k['k2'], k['k1'].lower()), reverse=True)
>>> for t in test:
...     print(t)
...
{'k1': 'Wgr', 'k2': True}
{'k1': 'qsd', 'k2': True}
{'k1': 'lfe', 'k2': True}
{'k1': 'Asd', 'k2': True}
{'k1': 'aqd', 'k2': True}
{'k1': 'weg', 'k2': False}
{'k1': 'wef', 'k2': False}
{'k1': 'Ukz', 'k2': False}
{'k1': 'JKd', 'k2': False}

我正在寻找:

{'k1': 'aqd', 'k2': True}
{'k1': 'Asd', 'k2': True}
{'k1': 'lfe', 'k2': True}
{'k1': 'qsd', 'k2': True}
{'k1': 'Wgr', 'k2': True}
{'k1': 'JKd', 'k2': False}
{'k1': 'Ukz', 'k2': False}
{'k1': 'wef', 'k2': False}
{'k1': 'weg', 'k2': False}

1 个答案:

答案 0 :(得分:3)

您已经关闭,将not k['k2']用作第一个分类器。

>>> test.sort(key=lambda k: (not k['k2'], k['k1'].lower()))
>>> test
[{'k1': 'aqd', 'k2': True},
 {'k1': 'Asd', 'k2': True},
 {'k1': 'lfe', 'k2': True},
 {'k1': 'qsd', 'k2': True},
 {'k1': 'Wgr', 'k2': True},
 {'k1': 'JKd', 'k2': False},
 {'k1': 'Ukz', 'k2': False},
 {'k1': 'wef', 'k2': False},
 {'k1': 'weg', 'k2': False}]
not k['k2']为True且False(= 0) Falsek['k2']