我有字典列表,为简单起见,我把它们写成字符串:
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
一样?
答案 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>