4

我可以通过使用列表索引来做到这一点......

lst =[1,2,3,4,5,6]
[ [lst[i] , lst[i+1]] for i in range( len(lst) - 1 )]

或者:

lst =[1,2,3,4,5,6]
for i in range(len(lst)-1): 
    entities.append([lst[i],lst[i+1]])

但是有更聪明的方法吗?也许使用迭代器?性能呢?

4

5 回答 5

5

对于一般解决方案(因为您要求夫妻、三人等),请使用itertools.tee

from itertools import tee

def adjacent_tuples(iterable, n=2):
    iterators = tee(iterable, n)
    for i, iterator in enumerate(iterators):
        for j in range(i):
            next(iterator)
    return zip(*iterators)

这使用最少的内存并且适用于任何长度的元组:

>>> list(adjacent_tuples(range(8), 4))
[(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6), (4, 5, 6, 7)]
于 2013-09-15T22:03:31.343 回答
4

你在这里收到了一些聪明的答案,但我想建议最明显的方法是使用内置的切片索引。像这样:

def gen_k_slices(seq, k):
    for i in range(len(seq) - k + 1):
        yield seq[i:i+k]

这是一个小测试驱动程序:

TEST = [1, 2, 3, 4, 5, 6]
for k in range(8):
    print("k={} -> {}".format(k, list(gen_k_slices(TEST, k))))

及其输出:

k=0 -> [[], [], [], [], [], [], []]
k=1 -> [[1], [2], [3], [4], [5], [6]]
k=2 -> [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
k=3 -> [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
k=4 -> [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
k=5 -> [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]
k=6 -> [[1, 2, 3, 4, 5, 6]]
k=7 -> []

我也不喜欢 k=0 的结果;-)

于 2013-09-15T23:10:13.030 回答
2

您可以使用zip()

>>> lst = [1,2,3,4,5,6]

>>> list(zip(lst[:-1],lst[1:]))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

>>> list(zip(lst[:-2],lst[1:-1],lst[2:]))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
于 2013-09-15T21:46:54.140 回答
1

您可以压缩迭代器,一个是常规的,另一个是移位的:

>>> it = iter(lst)
>>> it.next()
1
>>> zip(iter(lst), it)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

这是一个合适的生成器(使用izip):

from itertools import izip


def my_zip(l):
    i1 = iter(l)
    i2 = iter(l)
    i2.next()
    for value in izip(i1, i2):
        yield value


lst = [1,2,3,4,5,6]
print list(my_zip(lst))  # prints [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
于 2013-09-15T21:44:17.347 回答
1

迭代器将是这样的。

def iterate_couples(lst):
    for i in range(len(lst) - 1): 
        yield [lst[i], lst[i + 1]]
于 2013-09-15T21:45:21.143 回答