我是一名新手并且在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')。我知道我使它变得比它应该更复杂!在此先感谢您帮助新手。
答案 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