按键排列的命令列表的复杂类型:键值的每个元组的升序和降序

时间:2019-03-21 23:04:00

标签: python python-3.x sorting

我有一个字典列表,我想通过它的“段”键对它们进行排序,这些键是元组列表:

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]中。

所以我首先要按第一个元组的第一个元素升序排序,然后按最后一个元组的第二个元素降序排序。
像字典1和3这样的情况是可以的,但是对于象字典2和4这样的其他字典,我必须遍历所有元组,并按第一个元素升序排序,然后按第二个元素降序排序。

我实现第一步的代码是:

sorted_example = sorted(example, key=lambda k: (k['segment'][0][0], -k['segment'][-1][1]))

但是我无法弄清楚如何遍历一个列表中的所有元组并按如上所述对它们进行升序和降序排序。

如果有人可以给我提示,我会非常非常高兴!

1 个答案:

答案 0 :(得分:0)

您可以使用生成器表达式来迭代dict中给定子列表的元组,并返回第二个取反的项的元组,以便将其按降序排序。将生成器表达式解压缩到键函数的输出元组中,以便在为您的第一条规则放置项目之后考虑它:

sorted(example, key=lambda k: (k['segment'][0][0], -k['segment'][-1][1], *((a, -b) for a, b in k['segment'])))

这将返回:

[{'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'}]