Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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:基于上一个值的列表理解?_Python_List Comprehension - Fatal编程技术网

Python:基于上一个值的列表理解?

Python:基于上一个值的列表理解?,python,list-comprehension,Python,List Comprehension,假设我想使用列表理解创建一个列表,如: …即,从某个数字开始,并根据同一列表中的数字生成n个“一半”。我可能会错过一些简单的python方法,或者我将不得不依赖一个好的ol'for循环。这能做到吗?谢谢。定义一个生成器,并在列表中使用它: def halve(n): while n >= 1: yield n n /= 2 print([_ for _ in halve(100)]) >> [100, 50.0, 25.0, 12.5,

假设我想使用列表理解创建一个列表,如:


…即,从某个数字开始,并根据同一列表中的数字生成n个“一半”。我可能会错过一些简单的python方法,或者我将不得不依赖一个好的ol'for循环。这能做到吗?谢谢。

定义一个生成器,并在列表中使用它:

def halve(n):
    while n >= 1:
        yield n
        n /= 2

print([_ for _ in halve(100)])
>> [100, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625]
或者简单地将其转换为列表:

print(list(halve(100)))
>> [100, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625]
编辑,以防@R Nar的评论正确:

def halve(start, n):
    for _ in range(n):
        yield start
        start /= 2

print(list(halve(100, 3)))
>> [100, 50.0, 25.0]

print(list(halve(100, 4)))
>> [100, 50.0, 25.0, 12.5]

下面的代码可以使用int,但不能使用float

[100>>i for i in range(10)]
这将返回:

[100, 50, 25, 12, 6, 3, 1, 0, 0, 0]
这个怎么样

start = 2500.0
n = 50
halves = [start / 2.0**i for i in range(n)]
等于:

[start * 2.0**(-i) for i in range(n)]
与@DeepSpace的答案相比,效率可能要低一些,但是一行程序可以尝试一下(Python 3.8.5):


我想可以使用列表comp来实现这一点,但它似乎是一个很好的生成器用例。这是一个很好的位级黑客:)@Finwood,如果它能工作,它会完全满足OP的要求。好吧,让我们称之为粗略估计。但是我喜欢这种方法:-)是的,如果它起作用的话会很好:)但是为什么要投反对票呢?它工作得很好,直到最低的列表整数,我认为OP的意思是
n
一半的数目,所以如果
n=100
,它应该返回一个100个数字的列表。我认为OP想要生成一个
n
长度列表。好的,我添加了一个长度变量
[start * 2.0**(-i) for i in range(n)]
from itertools import accumulate 

n=5
result = list(accumulate(range(n), lambda acc, val: acc/2, initial=100))
print(result)