可能重复:
Python: Looping through all but the last item of a list
我想要遍历列表。每次迭代我想用当前和下一个术语计算一些东西。我可以做类似
的事情mylist = [1, 2, 3, 4]
for i in range(len(mylist)):
try:
compute(mylist[i], mylist[i+1])
except IndexError:
compute(mylist[i])
我也可以
mylist = [1, 2, 3, 4]
for num in mylist:
try:
compute(num, mylist[mylist.index(num)+1])
except IndexError:
compute(num)
这些都不是特别好。这样做有更多的pythonic方法吗?
答案 0 :(得分:1)
您可以使用内置函数enumerate
:
mylist = [1, 2, 3, 4]
for i, num in enumerate(mylist):
try:
compute(num, mylist[i+1])
except IndexError:
compute(num)
但是在两个实现之间进行选择相当容易 - 第二个不仅慢得多(O(n^2)
),而且对重复元素也有奇怪的语义。
答案 1 :(得分:1)
有三种方法可以做到这一点(虽然我可能更喜欢第一种,除非你的条件不同):
使用itertools.izip()
- 效率和Pythonic:
for item1, item2 in itertools.izip(my_list, my_list[1:]):
# do something...
使用enumerate()
:
for index, item in enumerate(my_list):
# do something...
将前一行存储在变量中(该示例假定列表中没有None
):
previous = None
for item in my_list:
if previous is None:
previous = item
continue
# do something...
答案 2 :(得分:0)
不使用itertools的功能样式可能类似于:
for t in zip(mylist, mylist[1:]):
compute(*t)
如果性能相当于您可以使用itertools.izip阻止在zip期间创建intermeida列表。
要涵盖问题中显示的特殊情况,请使用:
for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
compute(*t)
答案 3 :(得分:0)
要在最后覆盖您的特殊情况,您需要:
for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
compute(*t)