M.G*_*rot 0 python sorting dictionary list
上下文:
在 Python 3.9 中,即使存在重复项,按第二个列表对大多数对象的列表进行排序也很容易:
>>> sorted(zip([5, 5, 3, 2, 1], ['z', 'y', 'x', 'w', 'x']))
[(1, 'x'), (2, 'w'), (3, 'x'), (5, 'y'), (5, 'z')]
Run Code Online (Sandbox Code Playgroud)
如果要排序的列表包含字典,则排序通常会顺利进行:
>>> sorted(zip([3, 2, 1], [{'z':1}, {'y':2}, {'x':3}]))
[(1, {'x': 3}), (2, {'y': 2}), (3, {'z': 1})]
Run Code Online (Sandbox Code Playgroud)
问题:
但是,当要排序的列表包含重复项时,会出现以下错误:
>>>sorted(zip([5, 5, 3, 2, 1], [{'z':1}, {'y':2}, {'x':3}, {'w': 4}, {'u': 5}]))
*** TypeError: '<' not supported between instances of 'dict' and 'dict'
Run Code Online (Sandbox Code Playgroud)
这个问题对我来说非常疯狂:要排序的列表的值如何影响要排序的列表?
替代解决方案:
一种不太优雅的解决方案是按索引从列表中获取字典对象:
>>> sort_list = [5, 5, 3, 2, 1]
>>> dicts_list = [{'z':1}, {'y':2}, {'x':3}, {'w': 4}, {'u': 5}]
>>> [dicts_list[i] for _, i in sorted(zip(sort_list, range(len(sort_list))))]
[{'u': 5}, {'w': 4}, {'x': 3}, {'z': 1}, {'y': 2}]
Run Code Online (Sandbox Code Playgroud)
StackOverflow 上的相关问题:
StackOverflow 上提出了许多类似的问题,与
这种具体情况,特别是包括重复的情况尚未讨论。
其原因在于元组比较的工作方式。一般来说, ift1和t2是元组,t1 < t2if t1[0] < t2[0],但是 if t1[0] == t2[0],那么它会比较t1[1] < t2[1]等等。这意味着您可以比较元组,即使它们包含无法相互比较的项目,只要比较可以区分前面的项目即可。
解决这个问题的标准方法是提供一个忽略字典的关键函数:
sorted(zip([5, 5, 3, 2, 1], [{'z':1}, {'y':2}, {'x':3}, {'w': 4}, {'u': 5}]), key=lambda item: item[0])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |