1

我正在寻找以下问题的简单解决方案。

我们在 python 中是否有用于这种用法的 for 循环?

[2,3,4,5,6,7,8,9,0,1]

我有一个使用while循环的实现:

i = 2
while True:
    i = i%9
    if i == 1:
        break
    # payload code here
    i+=1
4

5 回答 5

7
for i in (2, 3, 4, 5, 6, 7, 8, 9, 0, 1):

...

for i in range(2, 10) + range(2):

...

for i in itertools.chain(xrange(2, 10), xrange(2)):

...

for i in (x % 10 for x in xrange(2, 12)):
于 2013-07-01T21:19:26.023 回答
6

您可以使用range

>>> for i in range(2,10) + range(0,2):
...     print i
...     
2
3
4
5
6
7
8
9
0
1

或使用itertools.chain(适用于 py2 和 py3):

>>> from itertools import chain
>>> for i in chain(range(2,10),range(0,2)):
    print (i)
...     
2
3
4
5
6
7
8
9
0
1
于 2013-07-01T21:17:57.487 回答
0

由于print语句/函数的开销,我更改了每次出现的printto pass,但这里是timeit不同方法的结果,每个运行 10000000 次:

使用 itertools.chain:

>>> timeit.timeit(stmt='for i in chain(xrange(2,10),xrange(0,2)): pass', setup='from itertools import chain', number=10000000)
11.17552900314331     # Ignacio
>>> timeit.timeit(stmt='for i in chain(range(2,10),range(0,2)): pass', setup='from itertools import chain', number=10000000)
13.646738052368164    # Ashwini

使用模数:

>>> timeit.timeit(stmt='for i in range(10): (i+2) % 10', number = 10000000)
13.806042909622192    # Bengt
>>> timeit.timeit(stmt='for i in (x % 10 for x in xrange(2, 12)): pass', number=10000000)
18.127070903778076    # Ignacio
>>> timeit.timeit(stmt='[(x+2)%10 for x in range(10)] and None', number=10000000)
21.191375017166138    # Bengt

附加范围:

>>> timeit.timeit(stmt='for i in range(2,10) + [0,1]: pass', number=10000000) 
10.056025981903076    # Hardik
>>> timeit.timeit(stmt='for i in range(2,10) + range(2): pass', number=10000000)
11.409713983535767    # Ignacio

文字表达:

>>> timeit.timeit(stmt='for i in (2,3,4,5,6,7,8,9,0,1): pass', number=10000000)
2.8564839363098145    # Ignacio

令人沮丧的是,最有效的方法是迭代数字的文字表达,但是,它涉及最少的分配和最少的算术。

于 2013-07-01T21:59:37.697 回答
0

使用内置range函数模运算符

>>> for i in range(10):
...     print((i + 2) % 10)
... 
2
3
4
5
6
7
8
9
0
1

在 Python3 中,您可以使用列表推导和print函数将其归结为一行:

>>> [print((x + 2) % 10) for x in range(10)] and None
2
3
4
5
6
7
8
9
0
1

在 Python2 中,在前面加上:

>>> from __future__ import print_function

或者,如果您只想要列表:

>>> [(x + 2) % 10 for x in range(10)]
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
于 2013-07-01T21:25:05.033 回答
0

尝试使用

for i in range(2,10)+[0,1]:  
    print i
于 2013-07-01T21:23:20.787 回答