如何在for循环中使用不同的值进行迭代?

时间:2019-09-17 21:02:54

标签: python loops optimization iteration

我想知道是否可以通过硬编码在“ for循环”中指定下一个要递增的值?

目前,我正在这种方式进行迭代: 例如:

wget

输出将为for i in range(0, 10, 2): print(i)

如果我想要一个0,2,4,6,85的值以及一个7的增量,我该怎么做?

例如:

2

3 个答案:

答案 0 :(得分:4)

如果我正确理解了您的问题,那么此代码适合您: 使用生成器理解:

pred = i%2 is 0
forced_values = [5, 7]

list((i for i in range(0, 10) if pred or i in forced_values))
# output: [0, 2, 4, 5, 6, 7, 8]

或等效地:

sorted(list(range(0, 10, 2)) + forced_values)

执行时间比较:

基准:

n = 10000000 # size of range values
m = 10000000 # size of forced_value list

1。生成器理解的解决方案:

%%timeit
list((i for i in range(0, n) if i%2 is 0 or i in range(0, m)))
# 3.47 s ± 265 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

2。排序解决方案:

%%timeit
sorted(list(range(0, n, 2)) + list(range(0, m)))
# 1.59 s ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

或具有无序列表(如果顺序不重要):

%%timeit
list(range(0, n, 2)) + list(range(0, m))
# 1.03 s ± 109 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

3。 @blhsing使用more_itertools软件包提出的解决方案,特别是collate函数:

%%timeit
l = []
for i in collate(range(0, n, 2), range(0, m)):
    l.append(i)
# 6.89 s ± 886 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

即使在很大的列表上,最好的解决方案似乎也是第二个,比其他提议的解决方案快2至4倍。

答案 1 :(得分:1)

为澄清起见,以下是一些相关评论:

如果我需要解析1到1000之间的增量增量,那么除了指定索引之外,还有其他方法吗?
例如:对于i在范围(1,1000,20)中;我需要介于178、235、650之间的i值。我可以在for循环中这样做吗?

技术答案是:是和否。 ,因为您当然可以在for循环中进行操作。 ,因为无法指定例外。 (否则,它们就不会是例外,对吗?)

您仍然使用for循环,因为Python的for循环实际上与索引或范围无关。这是关于遍历任意对象的。发生这样的情况是,许多其他语言具有的简单数字for循环最直接地翻译成Python,作为一个范围内的循环。但实际上,Python for循环的形式很简单

for x in y:
    # do stuff here

然后循环遍历y,无论y是什么,只要它是可迭代的,x都会取y的一个元素的值迭代。就是这样。

但是,您似乎真正想起的是一种循环查看大多遵循简单模式的数字的方法。我可能会这样:

values = list(range(1, 1000, 20)) + [178, 235, 650]
for i in sorted(values):
    print(i)

或者,如果您不介意较长的行:

for i in sorted(list(range(1, 1000, 20)) + [178, 235, 650]):
    print(i)

答案 2 :(得分:0)

您可以给for循环一个列表:

for i in [2, 4, 5, 6, 7, 8]:

如果遵循算法,也可以创建自定义迭代器。在此处的另一个答案中对此进行了描述:Build a Basic Python Iterator