在一行中将数字减半
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.]
简要说明:
您要查找的数组大小是:log_2(n)
,我从中计算得出:int(np.log(n)/np.log(2))
本质上 returns 满足不等式的最高整数指数: 2^x < n
那么您可以将问题重述为 sum[i=1 to x](n//2^i)
我想要达到的目标:
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.]
简要说明:
您要查找的数组大小是:
log_2(n)
,我从中计算得出:int(np.log(n)/np.log(2))
本质上 returns 满足不等式的最高整数指数:2^x < n
那么您可以将问题重述为
sum[i=1 to x](n//2^i)