获取列表对 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)
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)