为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2023-06-13 16:17:29
我有一个清单,我需要对 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)?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

是的,您正在寻找的是滑动/移动窗口。有多种方法可以实现这一点,但最简单的方法是tee()使用. 使用它,您可以定义如下所示的默认窗口大小为 2 的函数。islice()itertoolswindow()


import itertools


def 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)]


查看完整回答
反对 回复 2023-06-13
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

让我们尝试使用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]]


查看完整回答
反对 回复 2023-06-13
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

另一种方法可能是:

for i in things[0:-2]:
    a=things.index(i)
    process(things[a:a+3])


查看完整回答
反对 回复 2023-06-13
  • 3 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信