如何在一个列表中的指定索引处开始组合多个列表,同时还将各个索引处的值相加?
如果我有3个名单:
a = [1, 2, 3, 4, 5, 0, 0, 0, 0]
b = [2, 3, 4, 5, 6]
c = [5, 2]
我怎样才能这样做,以便我可以将列表b
和c
插入a
内的任何位置,相应的索引会合计?
例如,我可以从b
的第一个索引开始插入列表a
,并从c
的第五个索引开始插入列表a
。输出结果如下:
NewList = [1, 4, 6, 8, 10, *11*, 2, 0, 0]
您可以看到,在b
的上述索引中添加列表c
和a
时,第五个索引处存在重叠,我希望这样做。
我尝试将izip_longest
中的itertools
与切片方法结合使用:
result = [sum(n) for n in izip_longest(a[2:], b, fillvalue=0)]
但这会产生:
result = [5, 7, 9, 5, 6, 0, 0]
这会切断列表a
中的零和一个索引,这是我不想要的。但是,我想使用izip_longest
,因为我可以对不同长度的列表求和。
我想创建一个使用任意数量的列表来执行此操作的函数,因此a
可以是len = 1000的列表,并且我可以在任何地方插入任意数量的不同长度的列表a
,我想要的次数和索引值相加。
答案 0 :(得分:1)
这是一个应该做你要求的功能:
def combine(lista, listb, index_in_list_a_to_start_insert):
# left pad list b with zeros
newb = [0]*index_in_list_a_to_start_insert + listb
# right pad shorter list
max_len = max(len(lista), len(newb))
newa = lista if len(lista) >= max_len else lista + [0]*(max_len-len(lista))
newb = newb if len(newb) >= max_len else newb + [0]*(max_len-len(newb))
# sum element-wise
return [a + b for a, b in zip(newa,newb)]
您可以通过链接此函数来运行您的示例:
a = [1, 2, 3, 4, 5, 0, 0, 0, 0]
b = [2, 3, 4, 5, 6]
c = [5, 2]
combine(combine(a, b, 1), c, 5)
输出:
[1, 4, 6, 8, 10, 11, 2, 0, 0]
您可能还想添加一些错误检查以确保指定的索引是入站的。