使用zip 进行切片:
>>> for x,y in zip(data[::2], data[1::2]):
... print(f"{x}\t{y}")
...
300 5
400 7
500 4
>>>
或者你可以使用这种厚颜无耻的结构*:
>>> for x,y in zip(*[iter(data)]*2):
... print(f"{x}\t{y}")
...
300 5
400 7
500 4
以上内容应该让您体验到 Python 提供的大量迭代构造。但是,我建议坚持使用基本的循环结构,例如:
>>> for i in range(0, len(data) - 1, 2):
... print(data[i],data[i+1])
...
300 5
400 7
500 4
注意,学习更喜欢 for 循环而不是 while 循环。一旦掌握了它们,它们就不容易出错。您可以使用range 做很多事情。但是,这是等效的 while 循环:
i = 0
while i < len(data) - 1:
print(data[i], data[i+1])
i += 2
*注意,虽然我通常不使用这种神秘的东西,因为我看重可读性和简单性,但它是一种经典的 Python 主义。可以这样概括:
>>> def iter_by_n(iterable, n):
... return zip(*[iter(iterable)]*n)
...
>>> list(iter_by_n(range(9), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
但是,它只会给你直到最后一个完整的部分:
>>> list(iter_by_n(range(10), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
>>> list(iter_by_n(range(11), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
>>> list(iter_by_n(range(12), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
这通常是您想要的行为,但您也可以使用 itertools.zip_longest 使用您想要的任何默认值填写分区:
>>> from itertools import zip_longest
>>> def iter_by_n(iterable, n, fillvalue=None):
... return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)
...
>>> list(iter_by_n(range(10), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]
>>> list(iter_by_n(range(10), 3, fillvalue='FOO'))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 'FOO', 'FOO')]
>>> list(iter_by_n(range(11), 3, fillvalue='FOO'))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 'FOO')]
>>> list(iter_by_n(range(12), 3, fillvalue='FOO'))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
>>>