在Python 3中为循环实现Pythonic“i,j”样式?

时间:2015-08-02 00:44:33

标签: python python-3.x

在Python中实现C-Style'i,j'for循环的优雅,Pythonic解决方案是什么?这是一个示例循环:

for (i = 0, j = list.length - 1; i < list.length; j = i++ ){
    // Do stuff
}

我现在遇到了一些场景,我发现这种类型的循环很有用。但是,我似乎无法找到解决这个问题的优雅和Pythonic解决方案。

3 个答案:

答案 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