python - 自定义排序列表,了解一些项目的顺序

标签 python list sorting

我想使用自定义顺序对列表进行排序,只知道一些项目的顺序。其余项目本质上应被视为“其他”,其中顺序无关紧要。

例如,我有以下列表,我尝试对其中的一些项目进行排序。下面的代码将失败并出现 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 中,您无法订购 NoneTypeint,因此您必须将对 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/

相关文章:

python - 这两行代码有什么区别?机器学习阵列

python - 我如何使用 psycopg2 创建物化 View ?

c# - 从列表中获取唯一项

java - 字符串排序和字符串比较有什么区别。它们不是和我们必须比较字符串才能对其进行排序一样吗?

c++ - 在 QTreeWidget 中插入时自动排序

python - 有什么方法可以缩短这个日期的长度而不必运行 date() 吗?

python - 嵌套交叉验证与整体模型验证

list - 有没有办法获取谷歌代码上所有可用项目的列表?

c# - 在 C# 列表中查找重复项的最快方法

sorting - 如何在 JavaFX TableView 中禁用列排序