我有一个字典列表,我想按它的“段”键排序,这些键是元组列表:
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 这样的其他 dict,我必须遍历所有元组并按第一个元素升序排序,按第二个元素降序排序。
我实现第一步的代码是:
sorted_example = sorted(example, key=lambda k: (k['segment'][0][0], -k['segment'][-1][1]))
但我无法弄清楚如何遍历一个列表中的所有元组并如上所述对它们进行升序和降序排序。
如果有人能给我提示,我会非常非常高兴!
最佳答案
您可以使用生成器表达式迭代字典中给定子列表的元组,并返回一个项目元组,其中第二项取反,以便按降序排序。将生成器表达式解压缩到关键函数的输出元组中,以便在为第一个规则放置的项目之后考虑它:
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'}]
关于python - 按键 : ascending and descending for every tuple of key's value 对字典列表进行复杂排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55290517/