如何根据python中的另一个列表构建分组项列表?

时间:2012-02-27 11:10:39

标签: python

  

可能重复:
  iterate through pairs of items in python list

我有一个列表,我想创建另一个列表,它将包含第一个基于一个滑动窗口参数的项目的后续组和每个组的大小。即如果参数:

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方法。

5 个答案:

答案 0 :(得分:4)

这是一种方式:

def group(l, window, size):
    return [l[index:index + size] for index in xrange(0, len(l) - 1, window)]

DEMO

答案 1 :(得分:2)

来自Python documentation

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)

请参阅itertools recipes

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)