python - 按键 : ascending and descending for every tuple of key's value 对字典列表进行复杂排序

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

所以首先我想按第一个元组的第一个元素升序排序,然后按最后一个元组的第二个元素降序排序。
这对于 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/

相关文章:

Python 如何在类定义中初始化 Reader 对象

python - 如何将多个数组输出添加到数据帧?

python - Pandas:查找 CSV 中接下来每 10 个数据点的平均值

python - 如何将 Pandas 中的重复编号列转换为单个非编号列?

Python:迭代包含换行符的字符串

python - 在 TreeView PyQt4 中单击时无法抓取项目?

os.environ 变量的 Python 3.6 Lambda 代码错误

java - 如何根据 Java 中的几个条件从列表中删除重复项

javascript - 如何对 JS 对象文字进行排序?

linux - 用于排序 CSV 的 Unix 命令之间的差异