在字典

时间:2016-04-29 23:37:30

标签: python dictionary

我有一个默认的dict,如下所示:

my_dict = default(dict, {"K": {"k": 2, "x": 1.0}, "S": {"_":1.0, "s":1}, "EH": {"e":1.0}})

键是音素,字典本身的值是字形,它们出现一定次数,这是默认字典中的相应数字。

该函数应该返回另一个包含概率的默认dict,如下所示:

defaultdict(<class 'dict'>, {'EH': {'e': 1.0}, 'K': {'k': 0.6666666666666666, 'x': 0.3333333333333333}, 'S': {'_': 0.5, 's': 0.5}})

'e'保持不变,1.0 / 1 = 1.0。 'K'的值为0.66666和0.33333,因为2/3 = 0.66666和1/3 = 0.3333333。 'S'的值为0.5和0.5,因为每个值的1/2为0.5。返回词典中的概率必须总是为1。

到目前为止,我有这个:

from collections import defaultdict   

my_dict = default(dict, {"K": {"k": 2, "x": 1.0}, "S": {"_":1.0, "s":1}, "EH": {"e":1.0}})

def dict_probability(my_dict):

   return_dict = defaultdict(dict)

   for key, value in my_dict.items():
       for k, v in values.items():

我还想让它适用于默认的dict,如下所示:

    dict_two = defaultdict(dict, {('EH', 't'): {'e': 2}, ('N', 'e'): {'ne': 1, 'n': 2}})

哪些键中只包含字符,我希望它们只返回相同的字符。

我只是不确定如何正确地做到这一点任何帮助都会受到赞赏。

我每次调用函数时都想这样做:

    >>>my_dict = default(dict, {"K": {"k": 2, "x": 1.0}, "S": {"_":1.0, "s":1}, "EH": {"e":1.0}})
    >>>dict_probability(my_dict)
    >>>print(m_dict)
    defaultdict(<class 'dict'>, {'EH': {'e': 1.0}, 'K': {'k': 0.6666666666666666, 'x': 0.3333333333333333}, 'S': {'_': 0.5, 's': 0.5}})

我希望dict_probability函数也返回None

1 个答案:

答案 0 :(得分:1)

你基本上想要对值求和,然后除以每个子键的各个值。

result = defaultdict(dict)

for bigkey, d in yourdict.values():
    # bigkey="K", d={"k": 2, "x": 1.0}, ...
    total = sum(d.values())
    # d.values() == [2, 1.0]
    for k,v in d.items():
        # k="k", v=2, ...
        result[bigkey][k] = v / total
        # result["K"]["k"] = 3 / 2

如果你不考虑未来的程序员,这可以在一个非常丑陋的dict comp中完成。

result = defaultdict(dict).update({bigkey: {k: v / sum(d.values()) for k,v in d.items()} for bigkey,d in yourdict.items()})