我有两个列表[1,2,3,4]
和[1,2,3]
我想总结一下这些内容,以便为我提供以下内容:[1,3,5,7]
。
这是通过执行1+0=1
,2+1=3
,3+2=5
和4+3=7
完成的。
我知道itertools.zip_longest
可以做到这一点,但最终会用0
填补长度上的不匹配,给我[2,3,6,4]
而不是我想要的值。
我希望通过用零填充第一长度来解决长度不匹配的问题。
答案 0 :(得分:1)
您可以使用零填充第二个列表,并使用zip
:
s1, s2 = [1,2,3,4], [1, 2, 3]
new_result = [a+b for a, b in zip(s1, ([0]*(len(s1)-len(s2)))+s2)]
输出:
[1, 3, 5, 7]
答案 1 :(得分:1)
您可以使用reversed
函数以相反的顺序生成两个列表,以便zip_longest
将另一端的拉链对齐,然后再反转结果:
from itertools import zip_longest
lists = [1,2,3,4], [1, 2, 3]
print(list(map(sum, zip_longest(*map(reversed, lists), fillvalue=0)))[::-1])
这将输出:
[1, 3, 5, 7]
答案 2 :(得分:1)
您可以使用repeat建立 shift ,然后使用chain将移位与较短的移位连接起来:
from itertools import repeat, chain
first = [1, 2, 3, 4]
second = [1, 2, 3]
shift = repeat(0, abs(len(first) - len(second)))
result = [a + b for a, b in zip(first, chain(shift, second))]
print(result)
输出
[1, 3, 5, 7]
答案 3 :(得分:1)
内置的reversed()
函数可用于执行以下操作:
from itertools import zip_longest
def sum_lists(*iterables):
iterables = (reversed(it) for it in iterables)
return list(reversed([a+b for a, b in zip_longest(*iterables, fillvalue=0)]))
if __name__ == '__main__':
result = sum_lists([1, 2, 3, 4], [1, 2, 3])
print(result) # -> [1, 3, 5, 7]
result = sum_lists([1, 2, 3], [1, 2, 3, 4])
print(result) # -> [1, 3, 5, 7] # Order of args doesn't matter.
答案 4 :(得分:0)
您可以通过zip
和zip_longest
来反转列表来解决此问题。
from itertools import zip_longest
s1, s2 = [1,2,3,4], [1, 2, 3]
res = [a+b for a, b in zip_longest(reversed(s1), reversed(s2), fillvalue=0)]
最后,再次 reverse ,以产生所需的结果:
res = res[::-1]
print(res) # [1, 3, 5, 7]
@CoryKramer在他的评论中说,此方法的主要优点是您不必事先知道哪个列表最长。