Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义排序知道几个项目的顺序的列表_Python_List_Sorting - Fatal编程技术网

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))?谢谢!是否可以将它们放在新排序列表的末尾?