[英]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]
这段代码有几个问题:
在第二个比较中使用elif
而不是if
。 因此,如果s2
包含大于s1
的值,则不会尝试与s3
进行比较
你改变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.