我需要迭代一个整数列表:
2, 3, 4, 6, 9, 13, 19, 28, 42, ...
所以一般规则是list[i+1] = list[i]*3/2
。
该列表应在10 ^ 34之前或之前结束。
这意味着最后一个元素是10 ^ 34 * 2/3和10 ^ 34之间的数字。
我显然不能在内存中预先分配这个列表,所以像:
list = [2]
while True:
next = list[-1]*3/2
if next > 10**34:
break
list.append(next)
不可能。
我当然可以简单地使用上面的内容来迭代这些整数而不将它们存储在列表中或由某种迭代器生成。
但问题是我有嵌套循环,如下所示:
for i in xrange(...):
for j in xrange(...):
for m in xrange(...):
for n in xrange(...):
将其分解为几个while
循环会使代码非常糟糕。
理想情况下,我想要某种xrange
生成这个数字列表"在飞行中" (正如xrange
通常那样)。
任何想法都会受到高度赞赏。
谢谢。
答案 0 :(得分:2)
正如我在评论中提到的,这份名单实际上很长。因此,您可以将其初始化为:
[int(2 * (1.5 ** n)) for n in range(int(math.log(10 ** 34, 1.5) - 1))]
但是,这实际上与您给出的示例略有不同,其中您在生成下一个数字之前舍入为整数。在这种情况下,你必须反复做一些事情(据我所知):
i = 2
lst = []
while i < 10 ** 34:
lst.append(i)
i = int(i * 1.5)
答案 1 :(得分:1)
这可能就是你要找的东西:
lst = [2*1.5**i for i in range(0,192)]
最后一个词是2 * 1.5 ^ 191。
如果你想让它们都是整数,你可以说使用int()强制转换。
但是你应该注意到这样做的时间/内存可能与你在示例代码中所做的类似。他们最终都在做类似的事情。
如果你希望它们在整个过程中都是整数:
i = 2
lst = [2]
while i < 10**34:
lst.append(int(i*=1.5))
同样,这只会节省一定量的内存/时间。