2

我是一个新手,正在学习 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”)。我知道我让它变得比它应该的更复杂!在此先感谢您对新手的帮助。

4

6 回答 6

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
于 2013-06-28T02:39:54.997 回答
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
于 2013-06-28T02:37:15.220 回答
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}}

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

于 2013-06-28T02:37:23.940 回答
0

dict在将其添加到时使用相同,animal_dict因此为什么有一个额外的b键。您应该检查是否存在animal in animal_dict,如果不是,则使用空字典添加新密钥。

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

另一种选择是使用defaultdict 文档。这将消除循环中对密钥检查的需要。

于 2013-06-28T02:37:33.953 回答
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
于 2013-06-28T02:52:01.693 回答
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
于 2013-06-28T03:00:06.210 回答