我有一个列表,我想创建另一个列表,它将包含第一个基于一个滑动窗口参数的项目的后续组和每个组的大小。即如果参数:
a = ["a" ,"b" ,"c" ,"d" ,"e" ,"f"]
和sliding-window = 1,size = 2 然后我想要b:
b= [(a,b),(b,c),(c,d),(d,e),(e,f)]
滑动窗口用于决定下一个元组的索引。每个时间列表将遍历1.I.e:如果滑动窗口是2,那么我将: b = [(a,b),(c,d),(e,f)]
我正在寻找实现这一目标的pythonic方法。
答案 0 :(得分:4)
这是一种方式:
def group(l, window, size):
return [l[index:index + size] for index in xrange(0, len(l) - 1, window)]
答案 1 :(得分:2)
from itertools import tee, izip, islice
def pairwise(iterable, size=2, slide=1):
iters = [islice(it, i, None, slide) for i, it in enumerate(tee(iterable, size))]
return izip(*iters)
Demo:P Timeit说:
In [58]: timeit pairwise(xrange(1000))
100000 loops, best of 3: 4.6 us per loop
答案 2 :(得分:2)
你可以尝试这样:
def slice(initial_list, length):
return [ initial_list[i:i+length] for i in xrange(len(initial_list)-1)]
这会给:
a = ["a" ,"b" ,"c" ,"d" ,"e" ,"f"]
print slice(a, 2)
>>> [['a', 'b'], ['b', 'c'], ['c', 'd'], ['d', 'e'], ['e', 'f']]
答案 3 :(得分:0)
from itertools import tee, izip
def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return izip(a, b)
for v, w in pairwise(a):
(...)
答案 4 :(得分:0)
这与@Secator建议不同,不使用itertools
i = iter(a)
next(i)
result = zip(a,i)