不使用列表长度迭代子列表

我有一个清单,我需要对 3 个元素的连续(和重叠)组应用一些处理:

我可以这样做:

for i in range(len(things)-2):
    process(things[i:i+3])

例如:

things=[0, 1, 2, 3, 4, 5, 6, 7]

我想处理:

[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]

但是有没有一种聪明的(但可读的)方法可以在不显式使用的情况下做到这一点len(things)


扬帆大鱼
浏览 153回答 3
3回答

慕的地6264312

是的,您正在寻找的是滑动/移动窗口。有多种方法可以实现这一点,但最简单的方法是tee()使用. 使用它,您可以定义如下所示的默认窗口大小为 2 的函数。islice()itertoolswindow()import itertoolsdef window(iterable, n=2):    iters = itertools.tee(iterable, n)    for i, it in enumerate(iters):        next(itertools.islice(it, i, i), None)    return zip(*iters)然后你可以将它用作>>> things=[0, 1, 2, 3, 4, 5, 6, 7]>>> list(window(things, n = 3))[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]>>> for elem in window(things, n = 3):...     print(elem)... (0, 1, 2)(1, 2, 3)(2, 3, 4)(3, 4, 5)(4, 5, 6)(5, 6, 7)编辑:一次使用更简单的选项可能是>>> list(zip(things, things[1:], things[2:]))[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]

慕哥6287543

让我们尝试使用enumerate,这len(things[i : i+len_]) == len_是删除在结束迭代时累积的大小不均的列表。len_ = 3[things[i : i+len_] for i, j in enumerate(things) if len(things[i : i+len_]) == len_][[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]len_ = 4[things[i : i+len_] for i, j in enumerate(things) if len(things[i : i+len_]) == len_][[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7]]

慕妹3146593

另一种方法可能是:for i in things[0:-2]:     a=things.index(i)     process(things[a:a+3])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python