2013-06-28 53 views
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

真正需要的只是一个循环:

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 
+0

非常感谢Blender! :)我从这些帖子了解了很多。 – hylaeus

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 
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语句来区分每个语句。

0

将其添加到animal_dict时,您使用的是相同的dict,因此为什么还有一个额外的密钥。你应该检查是否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 documentation。这将消除循环中关键检查的需要。

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 
+0

这是真的!有很多种方法!谢谢史蒂夫。 – hylaeus

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