python计算数字各个位的和_我如何计算一个数字/位数组的所有可能性(在Python中,或任何与此相关的语言中)...

我已经连续三个小时绞尽脑汁了,但我还是不明白,所以我在这里问。(我在标题中写了python,但这几乎可以用于任何语言)

假设我有一个固定长度n的位数组(但它也可能是定义范围内的整数),比如5。

array=[0,1,1,0,0]

现在,如何生成所有数组,这些数组在数字范围内是可能的(在bits的情况下,是2)。

所以:

[0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [0,0,0,1,1] ...

我试过在这里寻找解决方案,但我总是找到一些相似的东西,但并不能完全解决我的问题。

为了解决这个问题,我尝试了各种循环,但是我总是不止一次得到一种可能性(不应该发生),或者没有得到所有可能的可能性。

我可以用if语句来实现这一点(检查组合是否已经存在),但这看起来非常简单。

有没有一个简单的方法,只使用循环,以获得所有的可能性?

谢谢你

编辑:因为这是下面提到的,不,这不是家庭作业。这是为了研究实现一个二进制状态的贝叶斯网络。(开/关)。

对于更一般的问题,他们可以是一个范围内的整数,想想里程表是如何工作的。增加最低的数字。当它超过范围的顶部时,它将返回0,然后下一个数字将递增;如果它超过范围的顶部,它将返回0,您将递增下一个更高的数字;依此类推。当第一个数字超过其顶部时,进程最终停止。

在python中,对类似的东西使用itertools

from itertools import product

for i in product([0,1], repeat=5):

print i

产量:

(0, 0, 0, 0, 0)

(0, 0, 0, 0, 1)

(0, 0, 0, 1, 0)

(0, 0, 0, 1, 1)

(0, 0, 1, 0, 0)

etc...

和往常一样,python被证明是前进的道路。我不知道有这么简单的事情存在。非常感谢。这确实产生了完全正确的答案!

我将通过循环从0到31(0B111111)并将二进制表示转换为固定长度的数组来解决这个问题。

您没有用语言标记这个,所以我不知道如何给您提供示例代码,但是这种方法应该可以工作。

1: 00001

2: 00010

3: 00011

...

30:11110

31:11111

编辑:刚刚看到你用python标记了这个问题。实现上述算法的python代码示例:

listLength=5

for x in range(0,2**listlength):

print(list(bin(x)[2:].zfill(listlength)))

打印输出:

['0', '0', '0', '0', '0']

['0', '0', '0', '0', '1']

['0', '0', '0', '1', '0']

['0', '0', '0', '1', '1']

['0', '0', '1', '0', '0']

['0', '0', '1', '0', '1']

['0', '0', '1', '1', '0']

['0', '0', '1', '1', '1']

['0', '1', '0', '0', '0']

['0', '1', '0', '0', '1']

['0', '1', '0', '1', '0']

['0', '1', '0', '1', '1']

['0', '1', '1', '0', '0']

['0', '1', '1', '0', '1']

['0', '1', '1', '1', '0']

['0', '1', '1', '1', '1']

['1', '0', '0', '0', '0']

['1', '0', '0', '0', '1']

['1', '0', '0', '1', '0']

['1', '0', '0', '1', '1']

['1', '0', '1', '0', '0']

['1', '0', '1', '0', '1']

['1', '0', '1', '1', '0']

['1', '0', '1', '1', '1']

['1', '1', '0', '0', '0']

['1', '1', '0', '0', '1']

['1', '1', '0', '1', '0']

['1', '1', '0', '1', '1']

['1', '1', '1', '0', '0']

['1', '1', '1', '0', '1']

['1', '1', '1', '1', '0']

谢谢你的回答。这很有帮助,尽管我对细节还不确定:这对任何长度的数组都有效吗,那么这会给我所有可能的表示吗?

是的!对于n长度的数组,需要从0循环到2^n-1。

我喜欢这个问题的Itertools解决方案-和那个一起去。我真希望我知道你马上就在使用python,否则我会建议我自己。:)

我也错过了Python。我在想它可能是任何东西,从C到哈斯克尔,再到帕斯卡。-)

这里有一个通用的递归伪代码来执行您所寻找的操作。

array_combination is function (length, elements)

if length < 1

then abort

end if

declare arrays as new array

if length is 1

then

loop for element in elements

declare element_array as new array

set element_array[0] to element

append element_array to arrays

end loop

else

loop for array in array_combination(length - 1, elements)

loop for element in elements

declare element_array as new array

set element_array[0] to element

append array to element_array

append element_array to arrays

end loop

append array to arrays

end loop

end if

return arrays

end function

对于给定的示例,您可以将此函数称为"array_combination(5,[1,0])"。有更好的方法来构建它,但是a)我太老了,做不了家庭作业;b)我不知道你的作业有什么限制;c)我不想让你作弊的事情变得太明显。

注意重复的代码和常见子表达式消除的机会,以及极其浪费的内存分配和缓存滥用。不过,我假设这是第一季度的计算机科学作业,所以他们可能不会反对你。

谢谢你的回复,但这不是"家庭作业"。这是一个模拟贝叶斯网络,我想实现我的重新搜索。我会努力按你写的去做。

import numpy as np

def all_combinations(width, vals):

return np.array(np.meshgrid(*[vals]*width,

indexing='ij')).reshape((width,-1)).transpose()

print(all_combinations(width=3, vals=[0,1]))

print(all_combinations(width=2, vals=['a','b','c']))

输出:

[[0 0 0]

[0 0 1]

[0 1 0]

[0 1 1]

[1 0 0]

[1 0 1]

[1 1 0]

[1 1 1]]

[['a' 'a']

['a' 'b']

['a' 'c']

['b' 'a']

['b' 'b']

['b' 'c']

['c' 'a']

['c' 'b']

['c' 'c']]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值