每次迭代列表中的每2个元素

18
l = [1,2,3,4,5,6,7,8,9,0]

如何一次迭代两个元素?

我正在尝试这样做,

for v, w in zip(l[:-1],l[1:]):
    print [v, w]

获取输出的方式如下:

[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, 6]
[6, 7]
[7, 8]
[8, 9]
[9, 0]

期望输出为

[1,2]
[3, 4]
[5, 6]
[7, 8]
[9,10]
10个回答

24
您可以使用 iter:
>>> seq = [1,2,3,4,5,6,7,8,9,10]
>>> it = iter(seq)
>>> for x in it:
...     print (x, next(it))
...     
[1, 2]
[3, 4]
[5, 6]
[7, 8]
[9, 10]

您还可以使用itertools中的grouper recipe

>>> from itertools import izip_longest
>>> def grouper(iterable, n, fillvalue=None):
...         "Collect data into fixed-length chunks or blocks"
...         # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
...         args = [iter(iterable)] * n
...         return izip_longest(fillvalue=fillvalue, *args)
... 
>>> for x, y in grouper(seq, 2):
...     print (x, y)
...     
[1, 2]
[3, 4]
[5, 6]
[7, 8]
[9, 10]

15
你可以按照自己的方式进行操作,只需在切片中添加一个步长部分,使得两个切片都跳过一个数字即可:
for v, w in zip(l[::2],l[1::2]):  # No need to end at -1 because that's the default
    print [v, w]

但我喜欢帮助器生成器:

def pairwise(iterable):
    i = iter(iterable)
    while True:
       yield i.next(), i.next()

for v, w in pairwise(l):
    print v, w

11

什么问题出现了:

l = [1, 2, 3, 4, 5, 6, 7, 8]
for j in range(0, len(l), 2):
    print(l[j: j + 2])
        
[1, 2]
[3, 4]
[5, 6]
[7, 8]

假设列表元素数量为偶数。


9

一个解决方案是

for v, w in zip(l[::2],l[1::2]):
    print [v, w]

4
In [180]: lst = range(1,11)

In [181]: for i in zip(*[iter(lst)]*2):
   .....:     print i
   .....:
(1, 2)
(3, 4)
(5, 6)
(7, 8)
(9, 10)

2
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> map(None,*[iter(l)]*2)
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
>>>

如何将它变成包含列表的列表而非元组的列表? - raja777m
1
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l2 = map(None, *[iter(l)] * 2) print(l2)输出的是map对象而不是k,v对。print(list(l2))会报错:TypeError: 'NoneType' object is not callable - raja777m

2

我知道这是一个老问题,只是有一个不同的方法。

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
chunks = [l[x:x+2] for x in range(0,len(l),2)]
print(chunks)

1

对于想要用非常长的步骤遍历列表且不想一开始就占用大量内存的人,您可以这样做。

Python 2.7:

import itertools

def step_indices(length, step):
    from_indices = xrange(0, length, step)
    to_indices = itertools.chain(xrange(step, length, step), [None])
    for i, j in itertools.izip(from_indices, to_indices):
        yield i, j

the_list = range(1234)
for i, j in step_indices(len(the_list), 100):
    up_to_100_values = the_list[i:j]

Python 3:

import itertools

def step_indices(length, step):
    from_indices = range(0, length, step)
    to_indices = itertools.chain(range(step, length, step), [None])
    for i, j in zip(from_indices, to_indices):
        yield i, j

the_list = list(range(1234))
for i, j in step_indices(len(the_list), 100):
    up_to_100_values = the_list[i:j]

0

使用map的另一种解决方案(与其他答案略有不同的语法)。在具有奇数个元素的列表中,最后一个元素与None配对:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> map(None, a[::2], a[1::2])
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, None)]

您可以修改函数,使其返回列表而不是元组:

>>> map(lambda x,y:[x,y], a[::2], a[1::2])
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, None]]

>>> for e in map(lambda x,y:[x,y], a[::2], a[1::2]):
...     print e
... 
[1, 2]
[3, 4]
[5, 6]
[7, 8]
[9, 10]
[11, None]

编辑:此解决方案仅适用于Python 2.x。


0
这里有一个简单有效的解决方案:
l = [1,2,3,4,5,6,7,8,9,0]
chunks = [(l[i-1], l[i]) for i in range(1, len(l))] 
print(chunks )

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接