Python 迭代指数增长的大量整数列表,其中指数为1.5
我需要迭代一个整数列表:Python 迭代指数增长的大量整数列表,其中指数为1.5,python,python-2.7,Python,Python 2.7,我需要迭代一个整数列表: 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.ap
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(...):
因此,将其分解为几个,而循环将使代码变得非常可怕
理想情况下,我希望有某种类型的xrange
,它“动态”生成这个数字列表(正如xrange
s通常所做的那样)。正如我在评论中提到的,这个列表实际上不会很长。因此,您可以将其初始化为:
[int(2 * (1.5 ** n)) for n in range(int(math.log(10 ** 34, 1.5) - 1))]
然而,这实际上与您给出的示例略有不同,您在生成下一个数字之前先将其舍入为整数。在这种情况下,您将不得不进行迭代(据我所知):
i=2
lst=[]
而我<10**34:
一、附加(一)
i=int(i*1.5)
这可能就是您想要的:
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))
i=2
lst=[2]
而我<10**34:
第一附加(int(i*=1.5))
同样,这只会节省少量内存/时间。实际上,列表不会很大:math.log(10**34,1.5)
返回193。@timchap:oops!!!!所以我也可以使用范围。你知道如何以pythonic的方式(即在一行中)生成它吗?Thanks@timchap:有趣的是,我在问这个问题之前就已经打开了我的浏览器。这应该是192,因为QA要求它在10^34之前停止。我认为这是我答案的重复,没有math.log
。这不会生成整数列表!即使将其转换为int
,这些整数也不一定与列表相同,其中每个整数都是前一个整数乘以1.5的下限值。我不知道这是您想要做的。在您的示例代码中,您实际上根本没有将任何内容强制转换为int,因此我只是遵循上面的-1
应该是+1
IMO。嗯,我根据您的要求“列表应该在10^34或之前结束”。列表中使用-1
的最后一个数字是8.599248e+33
,使用+1
的最后一个数字是1.934831e+34
。
i = 2
lst = [2]
while i < 10**34:
lst.append(int(i*=1.5))