将列表列表与python中的某个长度的另一个列表列表相结合

sha*_*ane 2 python

我正在寻找一个转换的衬垫

[[1], [1, 1], [1, 1, 1], [1], [1], [1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

算法将列表组合到一定的阈值长度.

我现在有这个

batched = []
batch = []
for l in lists:
    batch.extend(l)
    if len(batch) > threshold:
        batched.append(batch)
        batch = []
Run Code Online (Sandbox Code Playgroud)

nie*_*mmi 5

你的原始实现没有任何问题,但如果你坚持使用oneliner这里有一个丑陋的选择:

from itertools import accumulate, chain, groupby

THRESHOLD = 3
l = [[1], [1, 1], [1, 1, 1], [1], [1], [1], [1, 1, 1, 1]]
res = [[y for x in g for y in x[1]]
       for k, g in groupby(zip(chain([0], accumulate(len(x) for x in l)), l),
                           lambda x: x[0] // THRESHOLD)]
print(res)
Run Code Online (Sandbox Code Playgroud)

输出:

[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

这个想法是生成(item count so far, sublist)元组列表并通过除以计数来对它们进行分组THRESHOLD.

>>> temp = list(zip(chain([0], accumulate(len(x) for x in l)), l))
>>> temp
[(0, [1]), (1, [1, 1]), (3, [1, 1, 1]), (6, [1]), (7, [1]), (8, [1]), (9, [1, 1, 1, 1])]
>>> groups = [list(g) for k, g in groupby(temp, lambda x: x[0] // THRESHOLD)]
>>> groups
[[(0, [1]), (1, [1, 1])], [(3, [1, 1, 1])], [(6, [1]), (7, [1]), (8, [1])], [(9, [1, 1, 1, 1])]]
>>> [[y for x in g for y in x[1]] for g in groups]
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)