给定一个整数和二进制数,如何将整数拆分为尽可能相等的部分?
E.g。输出的总和应该等于输入整数
[in]: x = 20 , num_bins = 3
[out]: (7, 7, 6)
另一个例如
[in]: x = 20 , num_bins = 6
[out]: (4, 4, 3, 3, 3, 3)
我试过这个:
x = 20
num_bins = 3
y = [int(x/num_bins)] * num_bins
for i in range(x%num_bins):
y[i] += 1
它有效但必须有更简单/更好的方法,可能使用bisect
或numpy
?
使用https://stackoverflow.com/a/48899071/610569中的numpy
,我也可以这样做:
list(map(len, np.array_split(range(x), num_bins)))
但这有点令人费解,因为创建一个生成来获取假装列表并获得长度。
答案 0 :(得分:5)
内置的divmod
函数可能对此有用。
def near_split(x, num_bins):
quotient, remainder = divmod(x, num_bins)
return [quotient + 1] * remainder + [quotient] * (num_bins - remainder)
<强>演示强>
In [11]: near_split(20, 3)
Out[11]: [7, 7, 6]
In [12]: near_split(20, 6)
Out[12]: [4, 4, 3, 3, 3, 3]
答案 1 :(得分:2)
使用整数运算简化。
这是一个单行:
np.arange(n+k-1, n-1, -1) // k
小演示:
>>> for k in range(4, 10, 3):
... for n in range(10, 17):
... np.arange(n+k-1, n-1, -1) // k
...
array([3, 3, 2, 2])
array([3, 3, 3, 2])
array([3, 3, 3, 3])
array([4, 3, 3, 3])
array([4, 4, 3, 3])
array([4, 4, 4, 3])
array([4, 4, 4, 4])
array([2, 2, 2, 1, 1, 1, 1])
array([2, 2, 2, 2, 1, 1, 1])
array([2, 2, 2, 2, 2, 1, 1])
array([2, 2, 2, 2, 2, 2, 1])
array([2, 2, 2, 2, 2, 2, 2])
array([3, 2, 2, 2, 2, 2, 2])
array([3, 3, 2, 2, 2, 2, 2])