在for循环中处理alternate元素而不使用索引值

时间:2017-06-08 12:30:05

标签: python python-3.x for-loop

我有字典列表,为简单起见,我把它们写成字符串:

ls = ['element1', 'element2', 'element3', 'element4', 'element5', 'element6', 'element7', 'element8', 'element9', 'element10']

我正在尝试从列表中处理一对元素,如下所示:

#m1. Step for loop by size two with if condition 
for x in ls:
    if ls.index(x)%2 == 0:
        # my code to be process
        print(x) # for simplicity I just printed element


#m2. tried another way like below:
for x in range(0, len(ls), 2):
    # this way give me output of alternate element from list
    print(ls[x])

有没有办法在m1中迭代列表项时只获取备用元素,就像m2一样?

2 个答案:

答案 0 :(得分:5)

您可以按两个步骤切片列表;利用记忆:

for x in ls[::2]:
    print(x)

答案 1 :(得分:3)

您可以使用itertools.islice,步骤为2:

import itertools

for item in itertools.islice(ls, None, None, 2):  # start and stop None, step 2
    print(item)

打印哪些:

element1
element3
element5
element7
element9

islice不会创建新列表,因此它比l[::2]更节省内存,但代价是性能(它会慢一点)。

时间比较:

(注意:我使用IPythons %%timeit来衡量执行时间。)

对于短序列[::2]更快:

ls = list(range(100))

%%timeit

for item in itertools.islice(ls, None, None, 2):
    pass
  

每回路3.81μs±90 ns(平均值±标准偏差,7次运行,每次100000次循环)

%%timeit

for item in ls[::2]:
    pass
  每个循环

3.16μs±82 ns(平均值±标准偏差,7次运行,每次100000次循环)

但是对于长序列islice会更快并且需要更少的内存:

import itertools

ls = list(range(100000))

%%timeit

for item in itertools.islice(ls, None, None, 2):
    pass
  

3.14 ms±53.9μs/循环(平均值±标准偏差,7次运行,每次100次循环)

%%timeit

for item in ls[::2]:
    pass
  

4.82 ms±132μs/循环(平均值±标准偏差,7次运行,每次100次循环)

一个例外:如果您希望结果为list,那么切片[::2]将始终更快,但如果您想迭代它,那么islice应该是优先选项。< / p>