Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代指数增长的大量整数列表,其中指数为1.5_Python_Python 2.7 - Fatal编程技术网

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))