python 如何从多个列表中找到最大值以及它来自的对应列表

vc6uscn9  于 2022-12-25  发布在  Python
关注(0)|答案(3)|浏览(231)

所以我有n个数组,我想用python做一个元素比较,找到最大值。我找到了一个很好的解决方案here是:
np.maximum.reduce([a,b,c]).
但是我希望有另一个列表,其中的元组对应于最大值和它来自的列表。
x1米1米1 x、x1米2米1 x、x1米3米1 x
np.maximum.reduce([a,b,c])将返回一个列表[5,7,6],这很好。
但我想要另一份名单:
[(5,"b"), (7, "a"), (6,"b")]

khbbv19g

khbbv19g1#

a = [1, 7, 3]
b = [5, 3, 6]
c = [3, 5, 4]
l = {
    "a": a,
    "b": b,
    "c": c
}
k = list(l.keys())
transposed = list(map(list, zip(*l.values())))
max_indexes = [x.index(max(x)) for x in transposed]
column_max_with_keys = [(x[i], k[i]) for i, x in zip(max_indexes, transposed)]

结果:

[(5, 'b'), (7, 'a'), (6, 'b')]
dgjrabp2

dgjrabp22#

我本身并不需要字符串,而是返回最大值所在的列表。
鉴于OP的这种区别,我编写了以下代码片段:

a = [1, 7, 3]
b = [5, 3, 6]
c = [3, 5, 4]

def find_maxes(*args):

    return_data = list()
    
    for arg in args:
        return_data.append((max(arg), arg))
    
    return return_data
        

ret_1 = find_maxes(a, b, c)
ret_2 = find_maxes(a, b)
ret_3 = find_maxes(a)

print(f"Return 1:\n{ret_1}")  # [(7, [1, 7, 3]), (6, [5, 3, 6]), (5, [3, 5, 4])]
print(f"Return 2:\n{ret_2}")  # [(7, [1, 7, 3]), (6, [5, 3, 6])]
print(f"Return 3:\n{ret_3}")  # [(7, [1, 7, 3])]

此函数接受任意数量的列表,并查找列表中的最大值。然后将长度为2的元组添加到return_data列表中。列表中的每个元组的格式为:
(max_值,列表_搜索)
其中max_value是在list_searched中找到的最大值。

k5ifujac

k5ifujac3#

您需要将源字典转换为值和键的嵌套列表,并应用max()从相同索引的值中查找最大值。
初始转换可以使用下一个列表解析来完成:

[[(i, k) for i in v] for k, v in l.items()]

然后我们可以使用不同的选项一起迭代内部列表,第一个选项是将它们解包成zip(),并使用另一个列表解析对每个组调用max:

[max(i) for i in zip(*([(i, k) for i in v] for k, v in l.items()))]

另一种选择是利用map()的能力来处理多个可迭代项并在那里解包列表:

list(map(max, *([(i, k) for i in v] for k, v in l.items())))

完整代码:

l = {
    "a": [1, 7, 3],
    "b": [5, 3, 6],
    "c": [3, 5, 4]
}
result = [max(i) for i in zip(*([(i, k) for i in v] for k, v in l.items()))]
# OR
result = list(map(max, *([(i, k) for i in v] for k, v in l.items())))

输出:

[(5, 'b'), (7, 'a'), (6, 'b')]

相关问题