获取列表对 Python

Get Pairs of List Python

c = [1,2,3,4,5,6,7,8,9,10]

for a,b in func(c):
    doSomething()

所以 func() 必须 return (1,2) (2,3) (3,4) ... (8,9) (9,10)

python2.7有没有优雅的方法可以实现?

您可以使用 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() 那个 return 一个迭代器,所以你可以在列表理解中使用迭代器的 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)]

当然,有很多方法。最简单的:

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 秘诀一样。

试试这个:

c = list(range(1, 11))
for a, b in zip(c[:-1], c[1:]):
    doSomething()

方法很多

>>> 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:]))

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)