使用for循环时如何获取前一个元素? [复制]
Posted
技术标签:
【中文标题】使用for循环时如何获取前一个元素? [复制]【英文标题】:How to get the previous element when using a for loop? [duplicate] 【发布时间】:2011-04-29 11:47:38 【问题描述】:可能的重复:Python - Previous and next values inside a looppython for loop, how to find next value(object)?
我有一个包含很多元素的列表,我使用for
循环遍历列表。例如:
li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]
for i in li:
print(i)
但我想获取i
之前的元素。我怎样才能做到这一点?
【问题讨论】:
some other links 【参考方案1】:使用来自here 的itertools
配方的选项:
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 i, j in pairwise(li):
print(i, j)
【讨论】:
【参考方案2】:j = None
for i in li:
print(j)
j = i
【讨论】:
为什么这比 zip 和 itertool 解决方案不受欢迎?它更具可读性。【参考方案3】:使用循环计数器作为索引。 (一定要从 1 开始,这样你才能保持在范围内。)
for i in range(1, len(li)):
print(li[i], li[i-1])
【讨论】:
【参考方案4】:只需使用enumerate
跟踪索引并通过索引获取上一项
li = list(range(10))
for i, item in enumerate(li):
if i > 0:
print(item, li[i-1])
print("or...")
for i in range(1, len(li)):
print li[i], li[i-1]
输出:
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
or...
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
另一种选择是记住最后一项,例如
last_item = None
for item in li:
print(last_item, item)
last_item = item
【讨论】:
【参考方案5】:你可以使用zip
:
for previous, current in zip(li, li[1:]):
print(previous, current)
或者,如果您需要做一些更花哨的事情,因为创建列表或获取li
的一部分会效率低下,请使用pairwise
recipe from itertools
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
for a, b in pairwise(li):
print(a, b)
【讨论】:
+1 表示 itertools 的答案,而不是第一个。如果列表很小,第一个很好,但如果列表很大,创建副本效率低下。【参考方案6】:通常,您使用enumerate()
或range()
来遍历元素。这是使用zip()
的替代方法
>>> li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]
>>> list(zip(li[1:], li))
[(31, 2), (321, 31), (41, 321), (3423, 41), (4, 3423), (234, 4), (24, 234), (32, 24), (42, 32), (3, 42), (24, 3), (31, 24), (123, 31)]
每个元组的第二个元素是列表的前一个元素。
【讨论】:
是的,这确实有效,但如果您的列表非常大,您是否真的希望通过创建第二个非常大的列表(使用li[1:]
)来降低性能?
我已经说过它是另一种选择。当然,如果列表真的很大,那么不要使用这种方法。就这么简单。【参考方案7】:
li = [2,31,321,41,3423,4,234,24,32,42,3,24,,31,123]
counter = 0
for l in li:
print l
print li[counter-1] #Will return last element in list during first iteration as martineau points out.
counter+=1
【讨论】:
第一次迭代引发异常是错误的。alist[-1]
是列表的最后一个元素。听起来您并没有尝试自己运行它——不过,不值得投反对票。
谢谢 - 我今天学到了一些东西。 :-)以上是关于使用for循环时如何获取前一个元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript 中获取数组循环的前一个和下一个元素?
如何在 Python 的 for 循环中删除列表元素? [复制]
如何在 django 模板中获取 for 循环内的列表的下一个元素?
如何在没有 ConcurrentModificationException 的情况下使用 for-each 循环进行迭代时修改集合? [复制]