python - 使用函数从指定索引开始对 Python 中不同长度的列表求和

标签 python list function indexing python-itertools

如何组合从其中一个列表中的指定索引开始的多个列表,同时对各个索引处的值求和?

如果我有 3 个列表:

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

如何才能将列表 bc 插入到 a 内的任何位置,并且各自的索引将求和?

例如,我可以从 a 的第一个索引开始插入列表 b,也可以从第五个索引开始插入列表 ca。其输出如下所示:

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

您可以看到,在上述 a 索引处添加列表 bc 时,第五个索引处存在重叠,我想做的。

我尝试将 itertools 中的 izip_longest 与切片方法结合使用:

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,想要多少次就多少次,索引值就会求和。

最佳答案

这是一个应该满足您要求的函数:

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]

您可能还想添加一些错误检查以确保指定的索引在范围内。

关于python - 使用函数从指定索引开始对 Python 中不同长度的列表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47401701/

相关文章:

c++ - 将一个作用域中的枚举作为函数参数传递给另一个作用域

python - 从大目录中随机延迟加载文件

python - 如何处理南方(django)的重构?

python - 找到每个数字恰好只有一次并且能被 11 整除的最大数(在一个范围内)

python - 当创建/选择新项目和新解释器时,Pycharm 会做什么? (骨骼?)

c - ... 的多个定义(链接器错误?)

C++ 固定大小链表

python - 如何删除字符串列表中的特殊字符并将其拆分为单独的元素

python - 仅反转列表中的整数,无需切片或反向()

函数返回 bool 值?