【发布时间】:2019-03-22 08:28:19
【问题描述】:
我有一个字典列表,我想按它的“段”键排序,它们是元组列表:
example = [{'segment': [(329, 363), (379, 397)], 'name': '1'},
{'segment': [(329, 336), (339, 341), (396, 399)], 'name': '2'},
{'segment': [(329, 363), (379, 399)], 'name': '3'},
{'segment': [(329, 336), (337, 357), (396, 399)], 'name': '4'}]
排序后的列表应如下所示:
sorted_example = [{'segment': [(329, 363), (379, 399)], 'name': '3'},
{'segment': [(329, 336), (337, 357), (396, 399)], 'name': '4'},
{'segment': [(329, 336), (339, 341), (396, 399)], 'name': '2'},
{'segment': [(329, 363), (379, 397)], 'name': '1'}]
我想要的输出以某种方式排序,我可以轻松检查 dict[n+1] 是否完全包含在 dict[n] 中。
所以首先我想按第一个元组的第一个元素升序排序,然后按最后一个元组的第二个元素降序。
这对于像 dict 1 和 3 这样的情况是可以的,但是对于像 2 和 4 这样的其他 dicts,我必须遍历所有元组并按其第一个元素升序并按其第二个元素降序排序。
我实现第一步的代码是:
sorted_example = sorted(example, key=lambda k: (k['segment'][0][0], -k['segment'][-1][1]))
但我不知道如何遍历一个列表中的所有元组并按上述升序和降序对它们进行排序。
如果有人能给我提示,我会非常非常高兴!
【问题讨论】:
-
我仍然没有得到排序逻辑。为什么 dict 3 是排序列表中的第一个,而 dict1 是最后一个?
-
是什么让 dict 4 出现在 dict2 之前?
-
我的第一个排序步骤查看第一个元组的第一个元素并将它们升序排序。由于这里的所有值都相同,因此没有问题。接下来,字典按最后一个元组的第二个元素按降序排序,因此 dict 1 的 397 使该字典成为最后一个元素,因为最后一个元组的每隔一个第二个元素都大于 397。
-
在我的第二步中,这个排序逻辑适用于每个列表的每个元组:所以第一个元组的 363 使 dict 3 成为第一个 dict(第二个元组元素的降序!),而第一个元素dict 4 的第二个元组的第一个元素低于 dict 2 的第二个元组的第一个元素(337
标签: python python-3.x sorting