在一行中将数​​字减半

Halve a number in a single line

我想要达到的目标:

l = []
n = 100
while (n):
    l.append(n//2)
    n //= 2
    
print(l)
# [50, 25, 12, 6, 3, 1, 0]

我尝试过的:

>>> from itertools import takewhile
>>> n = 100
>>> [(n := n//2) for _ in takewhile(lambda x: x > 0, [n] * n)]
[50, 25, 12, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, ... 0, 0, 0]

这显然行不通,而且我也不喜欢创建大小为 n...

的数组的想法
from math import log2, floor
n = 100
l = [n//(2**x) for x in range(1, floor(log2(n))+2)]

这将使 l 保留为 [50, 25, 12, 6, 3, 1, 0]。 如果您不想要 0,请将 +2 更改为 +1

您可以使用 numpy 获得矢量化解决方案:

import numpy as np

n= 100

arr = np.array(n * np.ones(int(np.log(n)/np.log(2))))

arr = np.floor(arr / 2**(np.arange(len(arr)) + 1))

输出:

[50. 25. 12.  6.  3.  1.]

简要说明:

  1. 您要查找的数组大小是:log_2(n),我从中计算得出:int(np.log(n)/np.log(2)) 本质上 returns 满足不等式的最高整数指数: 2^x < n

  2. 那么您可以将问题重述为 sum[i=1 to x](n//2^i)