我可以通过使用列表索引来做到这一点......
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]])
但是有更聪明的方法吗?也许使用迭代器?性能呢?
我可以通过使用列表索引来做到这一点......
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]])
但是有更聪明的方法吗?也许使用迭代器?性能呢?
对于一般解决方案(因为您要求夫妻、三人等),请使用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)]
你在这里收到了一些聪明的答案,但我想建议最明显的方法是使用内置的切片索引。像这样:
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 的结果;-)
您可以使用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)]
您可以压缩迭代器,一个是常规的,另一个是移位的:
>>> 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)]
迭代器将是这样的。
def iterate_couples(lst):
for i in range(len(lst) - 1):
yield [lst[i], lst[i + 1]]