在Python中为字典中的值创建字典

时间:2015-07-29 07:17:43

标签: python dictionary

我正在尝试添加字典,这些字典具有来自列表中每个元素的键和来自列表中的一个后续元素的值以及它遵循它的次数的计数,以字典格式。例如,如果我们有单词列表['The', 'cat', 'chased', 'the', 'dog'],如果键是"",我希望值为{'dog':1,'cat':1}。整个输出应为{‘the’: {‘dog’: 1, ‘cat’: 1}, ‘chased’: {‘the’: 1}, ‘cat’: {‘chased’: 1}}

到目前为止,我的代码可以生成键和值,但不能以字典格式生成字典。有人可以帮忙吗?

我的代码:

line = ['The', 'cat', 'chased', 'the', 'dog']
output = {}
for i, item in enumerate(line):
    print(i, item, len(line))
    if i != len(line) - 1:
        output[item] = line[i+1]=i
print(output)

输出:

{'The': 'cat', 'chased': 'the', 'the': 'dog', 'cat': 'chased'}

3 个答案:

答案 0 :(得分:4)

我没有测试过,但可能是这样吗?使用defaultdict

from collections import defaultdict

line = ['The', 'cat', 'chased', 'the', 'dog']
output = defaultdict(lambda: defaultdict(int))

for t, token in enumerate(line[:-1]):
    output[token.lower()][line[t + 1].lower()] += 1

答案 1 :(得分:2)

您可以使用collections.Counter。示例 -

line = ['The', 'cat', 'chased', 'the', 'dog','the','dog']
from collections import Counter
output = {}
for i, item in enumerate(line):
    print(i, item, len(line))
    if i != len(line) - 1:
        output.setdefault(item.lower(),Counter()).update(Counter({line[i+1]:1}))

print(output)

.setdefault()首先检查密钥是否存在,如果不存在,则将其设置为第二个参数,然后返回该密钥的值。

在Counter中,当你执行.update()时,如果密钥已经存在,它会将计数增加1,所以这似乎是用于你的情况的正确结构。

此外,Counter的行为与普通字典一样,因此您可以稍后像任何字典一样使用它们。

演示(请注意修改后的输入以显示'dog'两次'the'后的情况 -

>>> line = ['The', 'cat', 'chased', 'the', 'dog','the','dog']
>>> from collections import Counter
>>> output = {}
>>> for i, item in enumerate(line):
...     print(i, item, len(line))
...     if i != len(line) - 1:
...         output.setdefault(item.lower(),Counter()).update(Counter({line[i+1]:1}))
...
0 The 7
1 cat 7
2 chased 7
3 the 7
4 dog 7
5 the 7
6 dog 7
>>> print(output)
{'dog': Counter({'the': 1}), 'cat': Counter({'chased': 1}), 'chased': Counter({'the': 1}), 'the': Counter({'dog': 2, 'cat': 1})}

答案 2 :(得分:0)

看起来导致麻烦的是这一行:

output[item] = line[i+1]=i

看起来您没有考虑输出[item]应该指向字典。看起来你需要小写单词,以便正确比较。

我能够使用以下代码获得您想要的输出:

line = ['The', 'cat', 'chased', 'the', 'dog']
output = {}
length = len(line)  # I didn't wanted to check this each iteration
for i, item in enumerate(line):
    item = item.lower()
    if i != length - 1:
        next_word = line[i + 1].lower()
        if item in output:
            output[item][next_word] = 1
        else:
            output[item] = {next_word: 1}
print(output)