【问题标题】:Summing lists of different lengths in Python beginning at a specified index using a function使用函数从指定索引开始对 Python 中不同长度的列表求和
【发布时间】:2018-05-04 05:51:23
【问题描述】:

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

如果我有 3 个列表:

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

如何才能将列表bc 插入a 中的任何位置,并且相应的索引会相加?

例如,我可以从a 的第一个索引开始插入列表b,也可以从a 的第五个索引开始插入列表c。这个输出看起来像:

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 的列表,我可以将任意数量的不同长度的不同列表插入到 @987654341 的任何位置@,我想要多少次,索引值都会求和。

【问题讨论】:

  • 如编辑提案中所述。 [b]b 不同。不要混淆这两者。
  • 我建议你简化你的问题。我承认我只读过一次,但很难理解你的意思。
  • 为什么不先逐行做呢?完美需要时间list comprehension。我不认为使用列表理解这会很容易(或可能)。换句话说,没有一个单一的解决方案
  • @GrzegorzOledzki 我的最终目标是绘制一个信号(例如正弦波),然后能够在我选择的任何位置将其他信号插入到该主信号中。所以我想将这些信号附加到列表中,通过添加额外的信号来操作它们,然后绘制。

标签: python list function indexing itertools


【解决方案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]

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

【讨论】:

  • 你知道如何保持原始列表的大小吗?例如,如果我使用您的 combine 函数将 b 添加到列表 a 的索引 6 中,则将 a 和 b 加在一起的输出将是 [1, 2, 3, 4, 5, 0, 2, 3, 4]。所以 len(a) 在函数之前和之后将具有相同的值。
  • 不向右填充较短的列表,而是截断newb,使其不超过a
  • 或者可以在末尾截断:newlist = combine(a, b, 6)[0:len(a)]
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 2021-01-21
相关资源
最近更新 更多