如何在Python中动态构建字典

时间:2017-09-27 10:40:04

标签: python dictionary

我想在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())

我想要做的是创建空的索引。但我似乎无法找到一种方法来做到这一点

1 个答案:

答案 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()会更安全(嗯,在这个确切的例子中可能不那么重要,但是比抱歉更安全......)