获取列表Python

时间:2015-02-01 18:00:31

标签: python list python-2.7

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中有一个优雅的方法来实现这个目的吗?

5 个答案:

答案 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()