提问人:G. Stergiopoulos 提问时间:5/10/2022 最后编辑:G. Stergiopoulos 更新时间:5/11/2022 访问量:62
将具有相同结构的多个列表与最低位置处具有较小整数的列表进行比较
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]
因为 是最小的整数,与没有相等值的最高位置相比。在上面的示例中,所有列表在最高索引(长度 1 插槽)处具有相等的值,因此我们需要比较 [length-2] 插槽。在那里,最小的值是 ,因此算法在此处停止并返回索引为 [length-2] 的最后一个列表。5
13, 24 and 33
5
5
如果 where 中的所有元素相等,则 check 应使用下一个最高索引。[-1] and [-2]
答案不得组合来自多个列表的不同值,它必须选择一个现有列表,其最低值位于最高位置。
有没有一种快速的方法来执行这样的比较? 谢谢!
答:
0赞
Xiidref
5/10/2022
#1
您可以使用该函数按索引对所有元素进行分组,然后使用其上的函数获取每个位置的最小值: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)]
评论
0赞
G. Stergiopoulos
5/10/2022
这产生了 [65, 23, 5, 6],这不是正确答案。您的答案结合了最低的排名,它不会选择最高位置具有最低值的列表
1赞
not_speshal
5/10/2022
#2
由于您的列表正在减少,因此您可以使用:
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]
评论
0赞
G. Stergiopoulos
5/10/2022
这几乎是正确的,您能否编辑您的答案以返回与每个输出相关的整个列表?例如,它应该返回其列表,而不是 23,即 [65, 23, 24, 6]
0赞
G. Stergiopoulos
5/10/2022
我不清楚我们如何返回整个列表,而不仅仅是元素的值。此外,这不适用于任意数量的列表,例如在列表列表中,我如何将变量分配给 min()?
0赞
Andrej Kesely
5/11/2022
#3
另一个版本:
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]
评论