python - 使用 *args 和指定的列表索引对列表求和

标签 python list function indexing

我之前在 Stack Overflow 上发布了一个问题,询问如何组合由整数值组成的列表,同时对各个索引处的值求和 ( Summing lists of different lengths in Python beginning at a specified index using a function )。我从 @pault 得到了一个很好的答案,但现在我想知道是否可以在函数中使用 *args 来添加任意数量的列表。

例如,我可以有 4 个列表(或任意数量):

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = [2, 4, 6, 8, 10, 12]
c = [1, 1, 1, 1, 1]
d = [2, 2, 2, 2, 2]

我想将列表 bcd 插入到 a 内的指定索引中。所以我可以说,在 a[2] 插入列表 b,在 a[2] 插入 cd位于a[5]。结果将是[0 1 5 8 11 16 19 21]

这是我当前使用的代码(归功于@pault):

a = [0, 0, 0, 0, 0, 0, 0, 0, 0]
b = [1, 1, 1, 1, 1, 1, 1, 1, 1]
c = [5, 2]

def combine(lista, listb, index_in_list_a_to_start_insert):

    newb = [0]*index_in_list_a_to_start_insert + listb
    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))

    return [a + b for a, b in zip(newa,newb)][0:len(a)]

要点是在任何索引处将任意数量的列表添加到 a 中,同时保持 a 的长度相同,例如,如果我添加列表 b 位于 a[6],结果将为 [0, 1, 2, 3, 4, 5, 8, 11]。我认为我最大的问题是将列表与我希望将其插入的索引相关联,例如将列表 b 放入 a[3] 并指定列表 c 进入 a[4] 等,同时保持列表 a 的长度相同,所以也许必须与**kwargs?类似于 {'list': 'index'}?我真的不知道该怎么办。我正在使用Python 3.4.3。

最佳答案

如果我正确理解你的问题,你实际上需要做的就是将 listb 放入列表列表中。

要对 combine 进行最少的更改,请使用 listb 迭代 zip 的每个项目和每个索引,这两者现在都应该是列表的列表:

def combine(lista, listb, index_in_list_a_to_start_insert):
    if isinstance(listb[0], list):  # check if the first item in listb
                                    # is a list; check for empty lists
        for actual_list_b, actual_insert_index in zip(listb, index_in_list_a_to_start_insert):
            lista = combine(lista, actual_list_b, actual_insert_index)
        return lista

    newb = [0]*index_in_list_a_to_start_insert + listb
    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))

    return [a + b for a, b in zip(newa,newb)][0:len(a)]

并使用上面的示例列表:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> b = [2, 4, 6, 8, 10, 12]
>>> c = [1, 1, 1, 1, 1]
>>> d = [2, 2, 2, 2, 2]
>>>
>>> combine(a, [b, c], [3, 4])
[0, 1, 2, 5, 9, 12, 15, 18]
>>>

您需要为 listb 和索引列表添加更多 isinstance() 检查,以确保两者都是列表或都不是列表且长度相同,其中最短的一个确定 zip 的结果.

关于python - 使用 *args 和指定的列表索引对列表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48417972/

相关文章:

python - 如何在 Tkinter OptionMenu 中设置变量?

java - 排序列表 <Number>

c - 在 C 中传递函数时出现 SegFault

python - TFTPy 导入,没有名为 tftpy 的模块

python - 如何在 django 模板中链接 {% include %}

html - 菜单全宽。列表项共享等宽以获得全宽

java - Android:如何在不使用 switch 语句的情况下从不同类调用同名函数?

javascript - 如何在页面加载时调用 Javascript 函数

python - 在Python中使用Beautifulsoup获取html标签中的内部文本

string - 方案 - 字符串附加错误类型以应用错误