这有效:
l = [6,2,2,5,2,5,1,7,9,4]
w = [2,2,1,1]
k = 1
def take(xs, runs, skip_size):
ixs = iter(xs)
for run_size in runs:
for _ in range(run_size ):
yield next(ixs)
for _ in range(skip_size):
next(ixs)
result = list(take(l, w, k))
print(result)
Result:
[6, 2, 5, 2, 1, 9]
该函数就是所谓的生成器,一次生成结果的一部分,这就是为什么它被组合成一个列表的原因list(take(l, w, k))
.
在函数内部,列表xs
传入的内容被包装在迭代器中,以便能够一次获取一项next()
.
runs
定义要获取和产出的物品数量,skip_size
定义每次“运行”后要跳过的项目数。
作为奖励,这里有一句有趣的俏皮话 - 如果您能弄清楚它为何有效,我想您已经足够了解这个问题了,可以继续前进了:)
[y for i, y in zip([x for xs in [[1] * aw + [0] * k for aw in w] for x in xs], l) if i]