python - Python中按字典顺序对列表列表进行排序

标签 python list sorting lexicographic lexicographic-ordering

我想获取元组列表的最小元素

a = [[(1, 0), (2, 0), (1, 1)], [(2, 0), (1, 1), (1, 0)], [(1, 1), (1, 0), (2, 0)]]

按照字典顺序,这样[(1,1),(1,0),(2,0)]] < [(1,0),(2,0),(1,1)] , 因为元组的第 0 个条目具有更高的优先级,即 1,1,2 < 1,2,1 , 第一个条目的优先级较低。

min(a)

返回[(1, 0), (2, 0), (1, 1)] ,这当然是不正确的。

我只需要最小元素的索引,因此错误的版本是

print(min(range(len(a)), key=lambda i: a[i]))

(最小元素和仅索引方法将受到赞赏)。

当然,可以使用 zip 或其他东西编写自定义循环,但我想要一种开销很小的解决方案。

最佳答案

您可以使用自定义 key 来压缩元组 ( zip ):

min(a, key=lambda x: list(zip(*x)))

输出:[(1, 1), (1, 0), (2, 0)]

它是如何工作的

元组列表的默认比较是通过比较第一个元组,然后是第二个元组,依此类推(深度优先,而您想要广度优先)。

由于您希望每个元组的第一项具有优先级,因此您需要重新组织元组。在内部,使用此 lambda x: list(zip(*x)) keymin 以这种方式查看项目:

[list(zip(*x)) for x in a]
# [[(1, 2, 1), (0, 0, 1)], [(2, 1, 1), (0, 1, 0)], [(1, 1, 2), (1, 0, 0)]]

它们的排序顺序是:

[[(1, 1, 2), (1, 0, 0)], [(1, 2, 1), (0, 0, 1)], [(2, 1, 1), (0, 1, 0)]]

关于python - Python中按字典顺序对列表列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76037946/

相关文章:

python - Ubuntu vs OSX 和 SSD vs HDD 上的多处理

python - 如何使用 fft 在频域中向正弦波添加相移?

python - 如何更改tensorflow的SKCompat中的global_step

python - 如何将 pandas dataframe 转换为具有多对一关系的有序列表?

python - 如何在 Python 中从蒙版分割图像创建轮廓(粗细可控)?

java - 当我使用列表时出现奇怪的空指针异常错误

python - 数组解释的循环旋转

javascript - 如何对选择列表中的选项进行排序但将一个选项保留在顶部

AngularJs 排序 orderBy 无法正常工作

algorithm - 强制 chrome 对 array#sort 使用合并排序或快速排序