遍历Python列表中的项目对[重复]
Posted
技术标签:
【中文标题】遍历Python列表中的项目对[重复]【英文标题】:Iterate through pairs of items in a Python list [duplicate] 【发布时间】:2011-08-11 12:13:16 【问题描述】:可能的重复:Iterate a list as pair (current, next) in PythonIterating over every two elements in a list
是否可以在 Python 中以以下方式迭代列表(将此代码视为伪代码)?
a = [5, 7, 11, 4, 5]
for v, w in a:
print [v, w]
它应该产生
[5, 7]
[7, 11]
[11, 4]
[4, 5]
【问题讨论】:
【参考方案1】:来自Iterate over pairs in a list (circular fashion) in Python的几乎一字不差:
def pairs(seq):
i = iter(seq)
prev = next(i)
for item in i:
yield prev, item
prev = item
【讨论】:
空列表将在i.next()
引发StopIteration
。
现在在 Py2.x 和 3.x 中测试了这个作品。【参考方案2】:
来自itertools
recipes:
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
for v, w in pairwise(a):
...
【讨论】:
@joaquin:不同之处在于它适用于迭代器,而不仅仅是序列。这里不需要,但你几乎不能称之为矫枉过正。我只是更喜欢迭代器,因为我一直在使用它们。 对于任何对循环对感兴趣的人,例如列表a
,只需:pairwise(a +[a[0] ] )
。
请注意那些发现这一点的人,这适用于迭代器的优点是这不需要随机访问数据流(即数组访问);相反,它只需要摄取每个项目一次,并将其缓存以供下一次评估。因此,如果你有一个 Twitter 消防软管,你就不需要将消防软管读入一个巨大的(也许是无限长的)数组中。
如果可迭代基数是奇数 VS zip,此解决方案不会删除最后一个元素。
在 Python 3 中,您将获得 ImportError: cannot import name 'izip' from 'itertools' (unknown location)
。您可以在 Python 3 的 itertools 中使用 zip
而不是 izip
。【参考方案3】:
要做到这一点,你应该这样做:
a = [5, 7, 11, 4, 5]
for i in range(len(a)-1):
print [a[i], a[i+1]]
【讨论】:
按索引引用列表项是 Python 中的一种反模式(除非项必须按顺序访问)。见github.com/JeffPaine/…【参考方案4】:>>> a = [5, 7, 11, 4, 5]
>>> for n,k in enumerate(a[:-1]):
... print a[n],a[n+1]
...
5 7
7 11
11 4
4 5
【讨论】:
如果你不打算使用k
,为什么要enumerate
?
我猜是因为我们需要索引。
@Tanin 那么for n i range(len(a)):
不是更准确和惯用吗?
是的,range(len(a) - 1) 更好。【参考方案5】:
您可以zip
列表本身没有第一个元素:
a = [5, 7, 11, 4, 5]
for previous, current in zip(a, a[1:]):
print(previous, current)
即使您的列表没有元素或只有 1 个元素,这仍然有效(在这种情况下,zip
返回一个空的可迭代对象并且for
循环中的代码永远不会执行)。它不适用于generators,仅适用于sequences(tuple
、list
、str
等)。
【讨论】:
这不起作用。您正在迭代的每个单独列表都不足以“跳过”下一条记录,因此您的示例给出的输出如下:[5, 7] [7, 11] [11, 4] [4, 5] 但这正是我们想要的结果,不是吗? 嗯......是的 - 我认为 OP 正在寻找它 - 虽然我看到“成对”迭代返回像 [5,7]、[11,4]、[5,None] @Brad 对于这种情况,zip(a[::2], a[1::2])
,它将在每个列表中步进 2。以上是关于遍历Python列表中的项目对[重复]的主要内容,如果未能解决你的问题,请参考以下文章