1

我很确定这是一个简单的问题,但我完全不知道如何解决这个问题。我正在尝试学习 coursera 上的 PGM 课程,它从联合概率分布开始。所以我试图生成给定n个变量的所有可能分布的列表,其中每个变量都可以在0...z之间取一些离散值

例如,假设我们有 3 个变量,每个变量只能取 0 和 1 我想生成这个:

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

我在 python 中工作,我对如何动态生成它画了一个空白。

4

3 回答 3

3

如果您更喜欢列表理解:

[[a, b, c] for a in range(2) for b in range(2) for c in range(2)]

而且我忘了提到你可以使用 pprint 来获得你想要的效果:

>>> import pprint  
>>> pprint.pprint([[a, b, c] for a in range(2) for b in range(2) for c in range(2)])  
[[0, 0, 0],  
 [0, 0, 1],  
 [0, 1, 0],  
 [0, 1, 1],  
 [1, 0, 0],  
 [1, 0, 1],  
 [1, 1, 0],  
 [1, 1, 1]]  
>>>   
于 2013-02-11T03:27:22.513 回答
2

听起来您想要笛卡尔积:

from itertools import product
for x in product([0,1], [0,1], [0,1]):
    print x

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

于 2013-02-10T22:13:23.437 回答
1

比 Nathan 的方法略有改进:

>>> import itertools
>>> list(itertools.product([0, 1], repeat=3))
[(0, 0, 0),
 (0, 0, 1),
 (0, 1, 0),
 (0, 1, 1),
 (1, 0, 0),
 (1, 0, 1),
 (1, 1, 0),
 (1, 1, 1)]
于 2013-02-11T03:29:11.793 回答