Jak*_*lec 2 python sorting list lexicographic lexicographic-ordering
我想获取元组列表的最小元素
a = [[(1, 0), (2, 0), (1, 1)], [(2, 0), (1, 1), (1, 0)], [(1, 1), (1, 0), (2, 0)]]
Run Code Online (Sandbox Code Playgroud)
按字典顺序排列,因此[(1,1),(1,0),(2,0)]] < [(1,0),(2,0),(1,1)],因为元组的第 0 个条目具有更高的优先级,即1,1,2 < 1,2,1,而第 1 个条目的优先级较低。
min(a)
Run Code Online (Sandbox Code Playgroud)
返回[(1, 0), (2, 0), (1, 1)],这当然是不正确的。
我只需要最小元素的索引,因此错误的版本是
print(min(range(len(a)), key=lambda i: a[i]))
Run Code Online (Sandbox Code Playgroud)
(最小元素和仅索引方法将受到赞赏)。
当然,可以使用 zip 或其他东西编写自定义循环,但我想要一种开销很小的解决方案。
您可以使用自定义键来压缩元组 ( zip):
min(a, key=lambda x: list(zip(*x)))
Run Code Online (Sandbox Code Playgroud)
输出:[(1, 1), (1, 0), (2, 0)]
元组列表的默认比较是通过比较第一个元组,然后是第二个元组,依此类推(深度优先,而您想要广度优先)。
由于您希望每个元组的第一项具有优先级,因此需要重新组织元组。在内部,使用 this lambda x: list(zip(*x)) key,min可以这样查看项目:
[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)]]
Run Code Online (Sandbox Code Playgroud)
他们的排序顺序是:
[[(1, 1, 2), (1, 0, 0)], [(1, 2, 1), (0, 0, 1)], [(2, 1, 1), (0, 1, 0)]]
Run Code Online (Sandbox Code Playgroud)