使用函数

时间:2017-11-20 21:50:46

标签: python list function indexing itertools

如何在一个列表中的指定索引处开始组合多个列表,同时还将各个索引处的值相加?

如果我有3个名单:

a = [1, 2, 3, 4, 5, 0, 0, 0, 0]
b = [2, 3, 4, 5, 6]
c = [5, 2]

我怎样才能这样做,以便我可以将列表bc插入a内的任何位置,相应的索引会合计?

例如,我可以从b的第一个索引开始插入列表a,并从c的第五个索引开始插入列表a。输出结果如下:

NewList = [1, 4, 6, 8, 10, *11*, 2, 0, 0]

您可以看到,在b的上述索引中添加列表ca时,第五个索引处存在重叠,我希望这样做。

我尝试将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,我想要的次数和索引值相加。

1 个答案:

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

您可能还想添加一些错误检查以确保指定的索引是入站的。