我正在寻找一个转换的衬垫
[[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)
你的原始实现没有任何问题,但如果你坚持使用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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |