我有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完全遍历列,计数就会增加。
请询问更多详细信息。如果需要,我还可以以文本文件的形式提供一个最小的可重现示例,其中包含矩阵和我当前正在使用的代码。
答案 0 :(得分:2)
不能完全确定所有问题如何组合在一起,但是对于“不同长度的压缩列表”问题,可以将itertools.zip_longest
与fillvalue=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]
]