2

我在这里尝试一种复杂的操作。我有一本结构如下的字典:

'Paul ': [5, Counter({'i': 1, 'in': 1, 't': 1, 'fa': 1, 'cr': 1})],
'Lisa ': [4, Counter({'f': 3, 'bo': 1})], 
'Tracy ': [6, Counter({'sl': 3, 'fi': 1, 'an': 1, 'piz': 1})], '
'Maria': [2, Counter({'t': 2})]

我需要做的是为键中的第一个值划分每个计数器值,并将这些值附加到键中。这样我就有了相当于:

'Paul': [5, Counter({'i': 1, 0.2, 'in': 1, 02, 't': 1, 02, 'cr': 1, 0.2})], 
  'Lisa ': [4, Counter({'f': 3, 0.75, 'bo': 1, 0.25})], 
  'Tracy ': [6, Counter({'sl': 3, 0.5, 'fi': 1, 0.16 'an': 1, 0.16 'piz': 1, 016 })], '
  'Maria': [2, Counter({'t': 2, 1})]

其中第一行 counter 的值除以 5,第二行除以 4,依此类推。我还尝试让两个不同的字典具有相同的键,并将第一个字典键的每个值除以第二个字典键的值,

k: float(dict1[k])/dict2[k] for k in dict1.keys() & dict2.keys()}

但也做不到。有没有一种简单的方法可以做到这一点?我真的很感谢你的帮助!

4

1 回答 1

3

正如 Martijn 在评论中指出的那样,您可以将Counter()对象用于您的值,这是一种将您的值更改为以元组为值的字典的方法:

from collections import Counter

data = {'Paul ': [5, Counter({'i': 1, 'in': 1, 't': 1, 'fa': 1, 'cr': 1})],
        'Lisa ': [4, Counter({'f': 3, 'bo': 1})],
        'Tracy ': [6, Counter({'sl': 3, 'fi': 1, 'an': 1, 'piz': 1})],
        'Maria': [2, Counter({'t': 2})]}

for lst in data.values():
    lst[1] = {k: (lst[0], float(v)/lst[0]) for k, v in lst[1].items()}

结果:

>>> data
{'Lisa ': [4, {'bo': (4, 0.25), 'f': (4, 0.75)}],
 'Maria': [2, {'t': (2, 1.0)}],
 'Paul ': [5, {'cr': (5, 0.2), 'fa': (5, 0.2), 'i': (5, 0.2), 'in': (5, 0.2), 't': (5, 0.2)}],
 'Tracy ': [6, {'an': (6, 0.16666666666666666), 'fi': (6, 0.16666666666666666), 'piz': (6, 0.16666666666666666), 'sl': (6, 0.5)}]}

请注意,这会修改您当前的字典,这是您可以创建新字典的方法:

result = {}
for key, lst in data.items():
    result[key] = [lst[0], {k: (lst[0], float(v)/lst[0]) for k, v in lst[1].items()}]
于 2013-11-09T00:57:37.397 回答