Python 按键对dict列表进行复杂排序:按键的每个元组升序和降序';s值

Python 按键对dict列表进行复杂排序:按键的每个元组升序和降序';s值,python,python-3.x,sorting,Python,Python 3.x,Sorting,我有一个dict列表,我想按它的“段”——键排序,这是元组列表: example = [{'segment': [(329, 363), (379, 397)], 'name': '1'}, {'segment': [(329, 336), (339, 341), (396, 399)], 'name': '2'}, {'segment': [(329, 363), (379, 399)], 'name': '3'}, {'seg

我有一个dict列表,我想按它的“段”——键排序,这是元组列表:

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这样的情况,这是可以的,但是对于像dict 2和4这样的其他dict,我必须迭代所有元组,并按第一个元素升序,按第二个元素降序

我实现第一步的代码是:

sorted_example = sorted(example, key=lambda k: (k['segment'][0][0], -k['segment'][-1][1]))
但我不知道如何迭代一个列表中的所有元组,并按照上面所述对它们进行升序和降序排序


如果有人能给我一个提示,我会非常非常高兴的

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

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

我仍然不明白排序逻辑。为什么dict3是排序列表中的第一个,而dict1是最后一个?是什么使dict4排在dict2之前?我的第一个排序步骤是查看第一个元组的第一个元素,并将它们升序排序。因为这里的所有值都是相同的,所以没有问题。接下来,dict按最后一个元组的第二个元素降序排序,因此dict 1的397使dict成为最后一个元素,因为最后一个元组的每一个第二个元素都大于397。在我的第二步中,这种排序逻辑适用于每个列表的每个元组:因此第一个元组的363使dict 3成为第一个dict(第二个元组元素的降序!),而dict 4第二个元组的第一个元素低于dict 2第二个元组的第一个元素(337<339)(第一个元组元素的升序!)太棒了,非常感谢!我以前对生成器表达式只有一个模糊的概念。这也会简化我的一些其他代码!如果我只想按生成器表达式对dict排序,正确的语法是什么?(没有
k['segment'][0][0],-k['segment'][-1][1]
)我尝试了许多变体,但仍然只得到语法错误……在这种情况下,您可以将生成器表达式传递给元组构造函数:
sorted(例如,key=lambda k:tuple((a,-b)表示a,b在k['segment'])