2013-06-28 50 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