【问题标题】:How to find max values from multiple list and the corresponding list it came from如何从多个列表中找到最大值及其来自的相应列表
【发布时间】:2022-12-24 21:10:49
【问题描述】:

所以我有 n 个数组,我想对它们进行元素比较并用 python 找到最大值。我找到here 的一个很好的解决方案是:

np.maximum.reduce([a,b,c])

但我想要另一个列表,其中的元组对应于最大值和它来自的列表。比如说

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

np.maximum.reduce([a,b,c]) 将返回一个列表 [5,7,6],这很好。

但我想要另一个列表:

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

【问题讨论】:

  • 在您的示例答案中,您有两次 B,这是故意的吗?为什么要在元组列表中使用字符串“a”、“b”?
  • 是的,它是故意的。我本身并不想要字符串,而是返回最大值来自的列表。

标签: python max elementwise-operations


【解决方案1】:
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')]

【讨论】:

  • 这个回答很干净
【解决方案2】:

我本身并不想要字符串,而是返回最大值来自的列表。

鉴于 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:
{ret_1}")  # [(7, [1, 7, 3]), (6, [5, 3, 6]), (5, [3, 5, 4])]
print(f"Return 2:
{ret_2}")  # [(7, [1, 7, 3]), (6, [5, 3, 6])]
print(f"Return 3:
{ret_3}")  # [(7, [1, 7, 3])]

此函数接受任意数量的列表并找到列表中的最大值。然后它向 return_data 列表添加一个长度为 2 的元组。列表中的每个元组都采用以下格式:

(max_value, list_searched)

其中 max_value 是在 list_searched 中找到的最大值。

【讨论】:

    【解决方案3】:

    您需要将源字典转换为值和键的嵌套列表,并应用 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')]
    

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 2015-10-24
      • 2020-03-08
      • 1970-01-01
      • 2021-03-22
      • 2021-07-17
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多