添加2个不同长度的列表列表

时间:2019-07-17 08:06:24

标签: python python-3.x list

我有2个列表。 清单1(例如X)是=

{
   "images":{
      "small":[
         "aa",
         "aa"
      ],
      "medium":[
         "https://amazon.com",
         "https://amazon.com",
         "bb"
      ],
      "large":[
         "https://microsoft.com",
         "https://microsoft.com",
         "cc"
      ]
   }
}

列表2是列表的列表(说Y),其行大小始终为4的倍数,但行大小可能不相同。

例如-

[ 0 , 0 , 0 , 0 ]

我想以4为一组的方式找到列元素的总和

因此,在此示例中,总和为[2,4,6,8] [5,6,7,8]

当前,我正在使用 [[1,2,3,4,5,6,7,8] , [1,2,3,4]]

固定计数一次完整遍历列的位置。假设Y中的列数为200。因此,对于4个数字的组的每次遍历,计数将保持不变(用于对矩阵进行切片)

但是,只要后4个元素的行长发生变化,X就会变为空。 一旦Y完全遍历列,计数就会增加。

请询问更多详细信息。如果需要,我还可以以文本文件的形式提供一个最小的可重现示例,其中包含矩阵和我当前正在使用的代码。

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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]]

答案 2 :(得分: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]
  ]