使用zip_longest对不同的长度列表求和并从开始而不是结束填充不同的长度

时间:2019-01-14 15:38:12

标签: python itertools

我有两个列表[1,2,3,4][1,2,3]

我想总结一下这些内容,以便为我提供以下内容:[1,3,5,7]

这是通过执行1+0=12+1=33+2=54+3=7完成的。

我知道itertools.zip_longest可以做到这一点,但最终会用0填补长度上的不匹配,给我[2,3,6,4]而不是我想要的值。

我希望通过用零填充第一长度来解决长度不匹配的问题。

5 个答案:

答案 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)

您可以通过zipzip_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在他的评论中说,此方法的主要优点是您不必事先知道哪个列表最长。