更多关于创建词典的词典

时间:2013-06-28 02:31:09

标签: python loops dictionary

我是一名新手并且在python中学习字典,并且花了一天时间把头脑包裹起来,我会很感激一些帮助!

我想创建一个字典词典:

data = [['dog', 'a'], ['mouse', 'a'], ['dog', 'b'], ['mouse', 'c'], ['dog', 'c']]
animals = ['dog', 'mouse']

我想这样做:

final = {'dog': {'a': 0, 'b': 0, 'c': 0}, 'mouse':{'a': 0, 'c': 0} }

到目前为止,我有这段代码,显然无效:

animal_dict = {}
for d in data:
    animal_dict[d[0]] = {}

letter_dict = {}
for animal in animal_dict:
    for d in data:
        if d[0] == animal:
            letter_dict[d[1]] = 0
            animal_dict[animal] = letter_dict

print animal_dict

请注意,它在“鼠标”词典中添加了一个额外的键('b')。我知道我使它变得比它应该更复杂!在此先感谢您帮助新手。

6 个答案:

答案 0 :(得分:4)

你真的只需要一个循环:

data = [['dog', 'a'], ['mouse', 'a'], ['dog', 'b'], ['mouse', 'c'], ['dog', 'c']]
animals = {}

for animal, letter in data:
    animals.setdefault(animal, {})[letter] = 0

或者如果您不喜欢setdefault

for animal, letter in data:
    if animal in animals:
        animals[animal][letter] = 0
    else:
        animals[animal] = {letter: 0}

defaultdict

from collections import defaultdict:

animals = defaultdict(dict) # creates a dict when the key doesn't exist

for animal, letter in data:
    animals.[animal][letter] = 0

答案 1 :(得分:1)

您要将animal_dict['dog']animal_dict['mouse']设置为同一个letter_dict对象。您添加到其中的任何键都将添加到另一个键中。

您实际上并不需要letter_dict。试试这个:

for animal in animal_dict:
    for d in data:
        if d[0] == animal:
            animal_dict[animal][d[1]] = 0

答案 2 :(得分:0)

>>> d = {}
>>> for i in data:
...     if i[0] not in d:
...             d[i[0]] = {i[1] : 0}
...     else:
...             d[i[0]][i[1]] = 0
... 
>>> d
{'mouse': {'a': 0, 'c': 0}, 'dog': {'a': 0, 'c': 0, 'b': 0}}

你正在使用相同的字典来输入狗和鼠标值,因此额外的'b'键,因为狗已经有了'b'。您可以创建一个if/else语句来区分每个语句。

答案 3 :(得分:0)

dict添加到animal_dict时,您使用相同的animal in animal_dict因此为什么还有一个额外的 b 键。您应该检查for animal in animal_dict: if not animal in animal_dict: animal_dict[animal] = {} for d in data: if d[0] == animal: animal_dict[animal][d[1]] = letter_dict 是否为{{1}},如果不是,则添加带有空字典的新密钥。

{{1}}

另一种选择是使用defaultdict documentation。这样就不需要在循环中进行密钥检查了。

答案 4 :(得分:0)

难道你不喜欢Python中有多少种不同的方法吗? : - )

您也可以在外部循环内移动letter_dict的创建:

for animal in animal_dict:
    letter_dict = {}    # Create new letter_dict for each animal
    for d in data:
        if d[0] == animal:
            letter_dict[d[1]] = 0
            animal_dict[animal] = letter_dict

答案 5 :(得分:0)

快速而肮脏,真的不需要动物名单。

d = {}
for animal, letter in data:
    if not d.has_key(animal):
        d[animal] = {}
    if not d[animal].has_key(letter):
        d[animal][letter] = 0