在Python中实现C-Style'i,j'for循环的优雅,Pythonic解决方案是什么?这是一个示例循环:
for (i = 0, j = list.length - 1; i < list.length; j = i++ ){
// Do stuff
}
我现在遇到了一些场景,我发现这种类型的循环很有用。但是,我似乎无法找到解决这个问题的优雅和Pythonic解决方案。
答案 0 :(得分:3)
在python中你可以跟踪前一个元素:
previous = lst[-1] # j = len(lst) - 1
for current in lst: # i = 0; i < len(lst); i++
print current, previous # lst[i], lst[j]
# do stuff
previous = current # j = i before incrementing
此处current
的范围超过lst[0]
到lst[-1]
,previous
的范围是lst[-1]
,然后是&#39;路径&#39; current
通过lst[0]
到lst[-2]
。
你很少需要Python中的索引循环,试着直接在迭代上循环。
答案 1 :(得分:1)
由于Python支持负列表索引(lst[-1] == lst[len(lst) - 1]
),这与通过单个索引迭代列表没有多大区别:
>>> lst = [1,2,3,5,7,11,13]
>>> for i in range(len(lst)):
... print(lst[i], lst[i-1])
...
1 13
2 1
3 2
5 3
7 5
11 7
13 11
如果您不介意使用切片制作列表的副本,您还可以使用zip()
访问相邻对中的列表项:
>>> for cur, prev in zip(lst, lst[-1:]+lst):
... print(cur, prev)
...
1 13
2 1
3 2
5 3
7 5
11 7
13 11
答案 2 :(得分:0)
我认为这是与您的代码段最接近的实现
ruby -ne 'puts $. if /pattern/' filename