我之前在 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]
我想将列表 b
、c
和 d
插入到 a
内的指定索引中。所以我可以说,在 a[2]
插入列表 b
,在 a[2]
插入 c
和 d
位于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/