Python 自定义排序知道几个项目的顺序的列表
我想使用自定义顺序对列表进行排序,只知道几个项目的顺序。在顺序无关紧要的情况下,其余项目本质上应被视为“其他” 例如,我在下面的列表中尝试对其中的几个项目进行排序。由于找不到羽毛球或板球,下面的代码将失败并出现键错误Python 自定义排序知道几个项目的顺序的列表,python,list,sorting,Python,List,Sorting,我想使用自定义顺序对列表进行排序,只知道几个项目的顺序。在顺序无关紧要的情况下,其余项目本质上应被视为“其他” 例如,我在下面的列表中尝试对其中的几个项目进行排序。由于找不到羽毛球或板球,下面的代码将失败并出现键错误 myList = ['Football', 'Baseball', 'Basketball', 'Badminton', 'Cricket'] myOrder = {"Baseball" : 1, "Basketball" : 2, "Football" : 3} myList
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))
谢谢大家!!是否可以将它们放在新排序列表的末尾 当然,您可以使用
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']
myList.sort(key=lambda val:myOrder.get(val,0))?谢谢!是否可以将它们放在新排序列表的末尾?