我想知道是否可以通过硬编码在“ for循环”中指定下一个要递增的值?
目前,我正在这种方式进行迭代: 例如:
wget
输出将为for i in range(0, 10, 2):
print(i)
如果我想要一个0,2,4,6,8
和5
的值以及一个7
的增量,我该怎么做?
例如:
2
答案 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
%%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)
%%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)
%%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。