我想在python中动态构建一个字典。基于一组具有一个维度的节目。
这是我在循环条目时目前所做的事情
class Show(object):
def __init__(self, json_data):
self.name = json_data.get("abstract_name")
self.id = json_data.get("abstract_key")
self.station = json_data.get("station")
self.first_letter = json_data.get("first_letter")
def to_dict(self):
return self.__dict__
shows = {}
for entry in json.get("material"):
show = Show(entry)
first_letter = show.first_letter
if shows.get(first_letter, None) is None:
shows.update(first_letter, {})
if shows.get(first_letter).get(show.id, None) is None:
shows.get(first_letter).update(show.id, {})
shows.get(first_letter).get(show.id).update(show.to_dict())
我想要做的是创建空的索引。但我似乎无法找到一种方法来做到这一点
答案 0 :(得分:2)
首先,您没有以正确的方式使用dict.update()
。 dict.update()
要求:
1 / dict(或类似dict)对象
d.update({"foo":"bar"})
2 / (key, value)
对的序列(列表或任何可迭代的)
d.update([("foo", "bar")])
3 / keyword args
d.update(foo="bar")
请注意,所有这三个示例都可以更简单地编写为
d["foo"] = "bar"
如果你想一次设置多个键和/或已经有另一个dict或一系列键值对, dict.update()
最有用。
此外,您不必.get()
一个密钥来测试它是否已设置,您可以使用key in yourdict
测试遏制(用{{1}取消它})ie:
key not in yourdict
但在您的情况下,最简单的解决方案是use a defaultdict
:
if first_letter not in shows:
shows[first_letter] = {}
最后一点:您的from collections import defaultdict
# we want a defaultdict of defauldicts of dicts,
# so we need a custom factory function
def defaultdict_of_dicts():
return defaultdict(dict)
shows = defaultdict(defaultdict_of_dicts)
for entry in json.get("material"):
show = Show(entry)
shows[show.first_letter][show.id].update(show.to_dict())
方法可能会产生不必要的副作用:
show.to_dict()
将>>> s = Show({"abstract_name":"name", "abstract_key": "key", "station":"station", "first_letter":"first_letter"})
>>> s.first_letter
'first_letter'
>>> d = s.to_dict()
>>> d
{'first_letter': 'first_letter', 'station': 'station', 'name': 'name', 'id': 'key'}
>>> d["first_letter"] = "gotcha"
>>> s.first_letter
'gotcha'
>>>
实施为to_dict()
会更安全(嗯,在这个确切的例子中可能不那么重要,但是比抱歉更安全......)