gpt4 book ai didi

python - 迭代列表的 n 个连续元素(重叠)

转载 作者:行者123 更新时间:2023-11-28 19:33:59 26 4
gpt4 key购买 nike

itertools python 模块为迭代器实现了一些基本构建 block 。正如他们所说,“它们形成了一个迭代器代数”。我期待,但我找不到使用该模块进行以下迭代的简洁方法。例如,给定一个有序实数列表

a = [1.0,1.5,2.0,2.5,3.0]

... 返回一个新列表(或只是迭代)按某个 n 值分组,比如 2

b = [(1.0,1.5),(1.5,2.0),(2.0,2.5),(2.5,3.0)]

我发现这样做的方法如下。首先将列表一分为二,使用偶数索引和奇数索引:

even, odds = a[::2], a[1::2]

然后构建新列表:

b = [(even, odd) for even, odd in zip(evens, odds)]
b = sorted(b + [(odd, even) for even, odd in zip(evens[1:], odds)])

本质上类似于移动均值。

是否有一种简洁的方法(使用或不使用 itertools)?


附言:

申请

a 列表想象成实验期间发生的某些事件的时间戳集:

timestamp       event
47.8 1a
60.5 1b
67.4 2a
74.5 2b
78.5 1a
82.2 1b
89.5 2a
95.3 2b
101.7 1a
110.2 1b
121.9 2a
127.1 2b

...

此代码用于根据不同的时间窗口对这些事件进行分段。现在我对 2 连续事件之间的数据感兴趣; 'n > 2' 将仅用于探索目的。

最佳答案

这正是pairwise itertools recipe是为了,对于 n=2 也就是。

from itertools import tee

def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)

演示:

>>> b = [1.0,1.5,2.0,2.5,3.0]
>>> list(pairwise(b))
[(1.0, 1.5), (1.5, 2.0), (2.0, 2.5), (2.5, 3.0)]

如果您正在寻找可变组大小,请参阅 user2357112's answer (我喜欢这种方法),或者更一般地说,您可以实现一个滑动窗口迭代器并获取切片 of which there are many approaches .


顺便说一句,使用新的 yield from 语法来组合生成器。

from itertools import tee, islice
def roll_window(it, sz):
yield from zip(*[islice(it, g, None) for g, it in enumerate(tee(it, sz))])

演示:

>>> b = [1.0,1.5,2.0,2.5,3.0, 3.5, 4.0, 4.5]
>>> list(islice(window(b, 3), None, None, 2))
[(1.0, 1.5, 2.0), (2.0, 2.5, 3.0), (3.0, 3.5, 4.0)]

关于python - 迭代列表的 n 个连续元素(重叠),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38151445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com