我想使用自定义顺序对列表进行排序,只知道一些项目的顺序。其余项目本质上应被视为“其他”,其中顺序无关紧要。
例如,我有以下列表,我尝试对其中的一些项目进行排序。下面的代码将失败并出现 KeyError,因为它找不到 Badminton 或 Cricket。
myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket']
myOrder = {"Baseball" : 1, "Basketball" : 2, "Football" : 3}
myList.sort(key=lambda val: myOrder[val])
如何考虑列表中的其余项目而不关心它们的顺序?
最佳答案
在 Python 2 中,您可以使用 myOrder.get
作为排序键,因为 None
(返回默认值 get
)总是小于任何整数:
>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket']
>>> myOrder = {"Baseball" : 1, "Basketball" : 2, "Football" : 3}
>>> myList.sort(key=myOrder.get)
>>> myList
['Badminton', 'Cricket', 'Baseball', 'Basketball', 'Football']
在 Python 3 中,您无法订购 NoneType
和 int
,因此您必须将对 get
的调用包装在另一个函数中,例如 user234461 的函数评论中的解决方案:
myList.sort(key=lambda val: myOrder.get(val, 0))
Thank you! Is it possible to have them placed towards the end of the newly sorted list?
当然,您可以使用 float('inf')
作为调用 get
的默认值:
>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket']
>>> myList.sort(key=lambda x: myOrder.get(x, float('inf')))
>>> myList
['Baseball', 'Basketball', 'Football', 'Badminton', 'Cricket']
编辑 2:或者您可以使用 defaultdict
将默认排序烘焙到您的 myOrder
字典中。我喜欢这样。
>>> from collections import defaultdict
>>> myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket']
>>> myOrder = defaultdict(lambda: float('inf'))
>>> myOrder.update({"Baseball" : 1, "Basketball" : 2, "Football" : 3})
>>> myList.sort(key=myOrder.__getitem__)
>>> myList
['Baseball', 'Basketball', 'Football', 'Badminton', 'Cricket']
关于python - 自定义排序列表,了解一些项目的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046221/