比较具有相同结构的多个列表,以找出在最低位置具有较小整数的列表

Compare multiple lists with same structure for the one with smaller integers at lowest positions

我有多个 [65, 34, 13, 6] 类型的列表(任意数量的列表,未预先设置)并且所有元素的大小都从索引开始递减[0] 到长度(例如 65 > 34 > 13 > 6)。我想比较所有这些并保留具有最小整数的那个,按最高索引排名。例如:

输入:

[165, 54, 33, 6]
[165, 34, 24, 6]
[65, 23, 13, 6]
[65, 55, 5, 6]

应该输出:

[65, 55, 5, 6]

因为 5 是与最高位置的 13, 24 and 33 相比的最小整数,没有相等的值。在上面的示例中,所有列表在最高索引(length-1 槽)处具有相同的值,因此我们需要比较 [length-2] 槽。在那里,最小的值是 5,所以算法在这里停止,returns 最后一个列表 5 在 [length-2] 索引处。

如果 [-1] and [-2] 中的所有元素都相等,则检查应使用下一个最高索引。

答案不能组合多个列表中的不同值,它必须从现有列表中选择一个具有最低值的最高位置。

有没有快速的方法来执行这样的比较? 谢谢!

您可以使用 zip 函数按索引对所有元素进行分组,然后对其使用 min 函数来获取每个位置的最小值:

l1 = [165, 54, 33, 6]
l2 = [165, 34, 24, 6]
l3 = [65, 23, 13, 6]
l4 = [65, 55, 5, 6]

output = [min(elements) for elements in zip(l1, l2, l3, l4)]

由于您的列表正在减少,您可以使用:

idx, val = [(i, min(vals)) for i, vals in enumerate(zip(*lsts)) if len(set(vals))>1][-1]
output = [l for l in lsts if l[idx]==val][0]
示例:
lsts = [[165, 54, 33, 6], 
        [165, 34, 24, 6], 
        [65, 23, 13, 6], 
        [65, 55, 5, 6]]

idx, val = [(i, min(vals)) for i, vals in enumerate(zip(*lsts)) if len(set(vals))>1][-1]
>>> [l for l in lsts if l[idx]==val][0]
[65, 55, 5, 6]

lsts = [[165, 54, 24, 6], 
        [165, 34, 24, 6], 
        [65, 23, 24, 6], 
        [65, 55, 24, 6]]

idx, val = [(i, min(vals)) for i, vals in enumerate(zip(*lsts)) if len(set(vals))>1][-1]
>>> [l for l in lsts if l[idx]==val][0]
[65, 23, 24, 6]

另一个版本:

lsts = [[165, 54, 33, 6], [165, 34, 24, 6], [65, 23, 13, 6], [65, 55, 5, 6]]

out = next(
    lsts[min(enumerate(t), key=lambda k: k[1])[0]]
    for t in zip(*map(reversed, lsts))
    if len(set(t)) > 1
)
print(out)

打印:

[65, 55, 5, 6]