在Python中动态创建字典

时间:2014-05-07 11:34:02

标签: python dictionary truthtable

我有这个清单和编号:

list = ['B','C']

我的桌子需要的结果是:

B    C    Prob
0    0    x
0    1    x
1    0    x
1    1    x

我如何建立这个真值表(可以有更多的可用物品,而不仅仅是3个)并为该行的概率分配一个数字?

我需要用字典构建它,我尝试了一些列表理解,但我不知道如何动态生成真值表,考虑到可能有多于/少于3个变量。

编辑:更清楚我的目标是拥有这样的字典:

dict = {"B":0/1,"C":0/1,"Prob":arbitraryNumber}

我需要将所有这些词典插入到列表中以表示表的结构,现在它是否更清晰?

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以使用powerset

生成真值表
def power_set(items):
    n = len(items)
    for i in xrange(2**n):
        combo = []
        for j in xrange(n):
            if (i >> j) % 2 == 1:
                combo.append(1)
            else:
                combo.append(0)
        yield combo    # if you want tuples, change to yield tuple(combo)


In [13]: list(power_set(l))
Out[13]: [[0, 0], [1, 0], [0, 1], [1, 1]]

In [14]: l=['B','C','E']

In [15]: list(power_set(l))
Out[15]: 
[[0, 0, 0],
[1, 0, 0],
 [0, 1, 0],
 [1, 1, 0],
 [0, 0, 1],
 [1, 0, 1],
 [0, 1, 1],
 [1, 1, 1]]

如果您想对数据进行输入,请将yield combo更改为yield tuple(combo)

然后你可以存储键值配对,如:

d={}
for data in power_set(l):
    d[data]="your_calc_prob"
print d
{(0, 1): 'your_calc_prob', (1, 0): 'your_calc_prob', (0, 0): 'your_calc_prob', (1, 1): 'your_calc_prob'}

如果您希望输出排序,您可以使用sorted()生成列表的副本并返回列表:

 sorted(list(power_set(l)))
 Out[21]: 
 [[0, 0, 0],
 [0, 0, 1],
 [0, 1, 0],
 [0, 1, 1],
 [1, 0, 0],
 [1, 0, 1],
 [1, 1, 0],
 [1, 1, 1]]

或者您可以使用list方法sort()对列表进行排序:

In [22]: data = list(power_set(l))  
In [23]: data.sort()
In [24]: data
Out[24]: 
[[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]]

答案 1 :(得分:0)

您可以使用itertools.product()生成真值表,然后根据逻辑运算确定概率。我不知道你想要使用哪种逻辑操作,所以让我们每行创建一个字典:

>>> l = ['B', 'C']
>>> truth_table = [dict(zip(l, x)) for x in product((0, 1), repeat=2)]
>>> print(truth_table)
[{'B': 0, 'C': 0}, {'B': 0, 'C': 1}, {'B': 1, 'C': 0}, {'B': 1, 'C': 1}]

为了计算概率,你可能需要一个单独的函数来做到这一点。例如,两个键的逻辑分离,0和1是值,基本上等于max()

>>> l.append('Prob')
>>> truth_table = [dict(zip(l, x + (max(x), )) for x in product((0, 1), repeat=2)]
>>> print(truth_table)
[{'B': 0, 'C': 0, 'Prob': 0},
 {'B': 0, 'C': 1, 'Prob': 1},
 {'B': 1, 'C': 0, 'Prob': 1},
 {'B': 1, 'C': 1, 'Prob': 1}]