Python for循环,从2到10开始,然后覆盖0和1

时间:2013-07-01 21:16:43

标签: python list loops

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

我们在python中有这种用法的 for -loop吗?

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

我有一个使用的实现,而 -loop:

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

5 个答案:

答案 0 :(得分: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)):

答案 1 :(得分: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

答案 2 :(得分:0)

尝试使用

for i in range(2,10)+[0,1]:  
    print i

答案 3 :(得分:0)

使用内置range functionmodulo operator

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

在Python3中,您可以使用list comprehensionprint function`将其简化为一行:

>>> [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]

答案 4 :(得分:0)

由于print语句/函数的开销,我将print的每次更改都更改为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

压低最有效的方法是如何迭代的数字的文字表达式,但是,它涉及最少的分配和最少的算术。