繁体   English   中英

Python 从不同列表中获取最大绝对值

[英]Python get max absolute value from different lists

我正在尝试创建一个 function 它将找到三个列表中每个条目的最大绝对值并将其组合到一个列表中。

给定三个列表:

S12 = [-3, 24,   8,  13,  24,  43,  33,  19, -14, -36, -30, -16, -21]
S23 = [13,  5, -67, -98,  37,  30,   9,  11,  -4,   2,  43,  26, -24]
S13 = [ 9, 40,  -2, -26, -25, -19, -25, -31,  36,  23,  39,  47,  29]

我希望代码获取最大绝对值,首先是 -3、13 和 9,然后是 24、5 和 40,依此类推。

我有以下代码:

def maxOfThree(s1, s2, s3):
    maxOfThree = s1
    for i in range(len(s1)):
        if abs(s2[i]) > abs(maxOfThree[i]):
            maxOfThree[i] = s2[i]
        elif abs(s3[i]) > abs(maxOfThree[i]):
            maxOfThree[i] = s3[i]
    return maxOfThree

maximumValueInThreeLists = maxOfThree(S12,S23,S13)
print(maximumValueInThreeLists)

预期的结果是

[13, 40, -67, -98, 37, 43, 33, -31, 36, -36, 43, 47, 29]

但我得到的 output 是

[13, 40, -67, -98, 37, 43, 33, -31, 36, -36, 43, 26, -24]

我无法弄清楚我的代码出了什么问题,但有些条目不正确(在本例中是最后两个,但这只是巧合)。

这可以在一行中完成:

S12 = [-3, 24,   8,  13,  24,  43,  33,  19, -14, -36, -30, -16, -21]
S23 = [13,  5, -67, -98,  37,  30,   9,  11,  -4,   2,  43,  26, -24]
S13 = [ 9, 40,  -2, -26, -25, -19, -25, -31,  36,  23,  39,  47,  29]

res = [max(t, key=abs) for t in zip(S12, S23, S13)]
print(res)  # -> [13, 40, -67, -98, 37, 43, 33, -31, 36, -36, 43, 47, 29]

由于zip的实现方式,这也可以处理不同长度的列表。 在这种情况下,最短的列表将定义结果的长度。 如果您希望代码为较短的列表假定为零,您可以使用itertools中的zip_longest代替。 下面给出了这两种行为的示例。

假设:

S12 = [-3, 24,   8,  13,  24]
S23 = [13,  5, -67, -98,  37,  30]
S13 = [ 9, 40,  -2, -26, -25, -19, -25]

zip

res = [max(t, key=abs) for t in zip(S12, S23, S13)]
print(res)  # -> [13, 40, -67, -98, 37]

使用itertools.zip_longest

from itertools import zip_longest
res = [max(t, key=abs) for t in zip_longest(S12, S23, S13, fillvalue=0)]
print(res)  # -> [13, 40, -67, -98, 37, 30, -25]

这段代码有几个问题:

  1. 在第二个比较中使用elif而不是if 因此,如果s2包含大于s1的值,则不会尝试与s3进行比较

  2. 你改变s1 ,例如在运行这个 function 之后添加print(S12) 有多种制作(浅)副本的方法, list(s1)s1[:]都是不错的选择

给予:

def maxOfThree(s1, s2, s3):
    maxOfThree = list(s1)
    for i in range(len(s1)):
        if abs(s2[i]) > abs(maxOfThree[i]):
            maxOfThree[i] = s2[i]
        if abs(s3[i]) > abs(maxOfThree[i]):
            maxOfThree[i] = s3[i]
    return maxOfThree

maximumValueInThreeLists = maxOfThree(S12,S23,S13)
print(maximumValueInThreeLists)

你可以这样做:

S12 = [-3, 24,   8,  13,  24,  43,  33,  19, -14, -36, -30, -16, -21]
S23 = [13,  5, -67, -98,  37,  30,   9,  11,  -4,   2,  43,  26, -24]
S13 = [ 9, 40,  -2, -26, -25, -19, -25, -31,  36,  23,  39,  47,  29]

def abs_max(s1, s2, s3):
    return [sorted(i,key=abs)[-1] for i in zip(s1, s2, s3)]
    # or even better
    # return [max(i,key=abs) for i in zip(s1, s2, s3)]
           

print(abs_max(S12, S23, S13))

返回

[13, 40, -67, -98, 37, 43, 33, -31, 36, -36, 43, 47, 29]
out = []
for i in range(len(S12)):
    out.append(max(S12[i],S23[i],S13[i], key=abs))
out

[13, 40, -67, -98, 37, 43, 33, -31, 36, -36, 43, 47, 29]

或在一行中

[max(i, key=abs) for i in zip(S12,S23,S13)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM