c = [1,2,3,4,5,6,7,8,9,10]
for a,b in func(c):
doSomething()
所以func()必须返回(1,2) (2,3) (3,4) ... (8,9) (9,10)
在python 2.7中有一个优雅的方法来实现这个目的吗?
答案 0 :(得分:5)
itertools documentation有一个配方:
from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
然后
for a,b in pairwise(c):
doSomething(a, b)
答案 1 :(得分:4)
当然,有很多方法。最简单的:
def func(alist):
return zip(alist, alist[1:])
这在Python 2中花费了大量内存,因为zip
创建了一个实际的列表,切片也是如此。有几种替代方案专注于可以节省内存的生成器,例如非常简单:
def func(alist):
it = iter(alist)
old = next(it, None)
for new in it:
yield old, new
old = new
或者你可以更好地部署功能强大的itertools
,就像@HughBothwell提出的pairwise
食谱一样。
答案 2 :(得分:1)
有很多方法
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> list(zip(a,a[1:]))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]
其他方式是
[(a[i],a[i+1]) for i in range(len(a)-1)]
当你想要一个功能时,你可以做到
func = lambda a : list(zip(a,a[1:]))
答案 3 :(得分:0)
您可以使用zip
:
>>> def pair(sample_list):
... return zip(sample_list,sample_list[1:])
...
>>> pair(a)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]
或者iter()
返回一个迭代器,所以你可以在列表推导中使用迭代器的next()
属性来获得正确的对,请注意,在两个配方中,第二个对象需要从结束[1:]
的第一个元素,然后我需要将主列表从前导切换到最后一个元素,因为迭代器会选择它:
>>> def pair(sample_list):
... it_a=iter(sample_list[1:])
... return [(i,it_a.next()) for i in sample_list[:-1]]
...
>>> pair(a)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]
答案 4 :(得分:0)
试试这个:
c = list(range(1, 11))
for a, b in zip(c[:-1], c[1:]):
doSomething()