不同长度的两个列表嵌套列表相加

4

我有两个列表。 第一个列表(称为X)为 =

[ 0 , 0 , 0 , 0 ]

List 2是一个列表(称为Y),其中列表的行大小始终是4的倍数,但行大小可以不相同。

例如 -

[[1,2,3,4,5,6,7,8] , [1,2,3,4]]

我想找到每组四个元素中每一列的元素之和。

所以对于这个例子,求和将会是[2,4,6,8] [5,6,7,8]

目前,我正在使用以下代码:

X = [sum(e) for e in zip(X , Y[j][count:count+4])]

其中count在一次完整的列遍历中保持不变。假设Y中有200列,那么对于每个四个数字的遍历,count将保持相同(它用于切片矩阵)。

但是,当最后四个元素的行长度发生改变时,X就变成了空的。

当Y在列方向上被完全遍历时,count会增加。

如果需要的话,请告诉我更多细节。我也可以提供一个最小可重现的示例,其中包含矩阵和我当前正在使用的代码。


3
我不理解其中的逻辑。 - U13-Forward
1
X和Y有什么关系?将每四个元素求和是可以的,但是对于每4个Y元素的总和,预期要做什么? - Lucas Wieloch
我想计算4个元素的列和的平均值。因此,X中的总和将被它们出现的次数所除。 - Tanmay Bhatnagar
@U10-Forward,请问您不理解什么,请在评论中说明,我会编辑问题并添加细节。 - Tanmay Bhatnagar
1
@TanmayBhatnagar "你不明白什么" 一切。 - U13-Forward
你想对Y中的每4个值求和,并将它们映射到X[index]值中吗?试着简化你想要算法做的事情。看起来你提供了一些与编程问题无关的细节,而且你并没有给出任何关于你想在X和Y中做什么的提示。 - Lucas Wieloch
3个回答

2

虽然我不太确定你的问题中所有内容的关系,但是针对"将长度不同的列表压缩"的问题,您可以使用itertools.zip_longestfillvalue=0。然后,您可以在第二步将所得到的求和列表细分成块。

>>> lsts = [[1,2,3,4,5,6,7,8] , [1,2,3,4]]                                 
>>> from itertools import zip_longest                                      
>>> sums = [sum(x) for x in zip_longest(*lsts, fillvalue=0)]               
>>> [sums[i:i+4] for i in range(0, len(sums), 4)]                          
[[2, 4, 6, 8], [5, 6, 7, 8]]

@U10-Forward 嗯,将列表压缩,将元素添加到相同的位置,并(也许)按四个元素的组进行分组。你怎么理解它? - tobias_k

0

使用 grouper 是另一种方法:

from itertools import zip_longest

y = [[1,2,3,4,5,6,7,8] , [1,2,3,4]]

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)


[[sum(t) for t in l] for l in grouper(zip_longest(*y, fillvalue=0), 4)]

输出:

[[2, 4, 6, 8], [5, 6, 7, 8]]

0

不太优化的解决方案:

y = [
     [1,2,3,4,5,6,7,8],
     [1,2,3,4],
     [1,2,3,4,5,6,7,8,10,11,12,13]
     ]

#  Statge-1 get the max column length 
max_cols = len(max(*y))

#  Stage-2 if any of them is having the cols less than max_cols, 
#  then fill with 0
word_list1 = [i if len(i) == max_cols else i+[0]*(max_cols-len(i)) for i in y]

#  Stage-3 sum the elements of corresponding columns
sum_the_list = [sum(x) for x in zip(*word_list1)]   
# or list(numpy.sum(word_list1, 0)) 

#  Stage-4 if required create the sub-lists 
sum_the_list1 = [sum_the_list[l:l+4] for l in range(0, max_cols, 4)]

#### Output ####

Stage1
 [
  [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0],
  [1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0],
  [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13]
 ]

Stage2
 [3, 6, 9, 12, 10, 12, 14, 16, 10, 11, 12, 13]

Stage3
 [
  [3, 6, 9, 12],
  [10, 12, 14, 16],
  [10, 11, 12, 13]
  ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接