Python嵌套字典追加-用defaultdict(lambda: defaultdict(set))解决



通过python方法在其他语言中执行了数百万次,因为这是转义。

基本上是从数据库读取一些数据。包括ID,水果,颜色,名称等数据

我需要在Name上创建一个对象/字典键。Name然后保存水果和颜色的列表/字典。

{"greenhouse1": {"fruits": {"apples", "oranges"}
{"colors": {"red","orange"}}

我正在逐行迭代数据库,Name键将出现不止一次。当它这样做时,水果或颜色可能已经填充,需要追加。

namedict = {}
db_rows = execute_query(cursor, args.store_proc)
for row in db_rows:
db_name = row.id
db_fruit = row.fruit
db_color = row.color
if db_name in namedict:
namedict[db_name]["fruits"].append(db_fruit)
namedict[db_name]["color"].append(db_color)
else:
namedict[db_name]["fruits"] = [db_fruit]
namedict[db_name]["color"] = [db_color]

collections.defaultdict是您的朋友:如果您访问defaultdict的新键,它将自动使用提供的函数初始化(在本例中为listset)。因为你想要一个字典(例如greenhouse1)的字典("fruits", "colors"),用列表作为值(单独的水果和颜色),我们需要一个嵌套的默认字典。下面的代码应该可以工作:

from collections import defaultdict
db = defaultdict(lambda: defaultdict(list))  # alternative: set instead of list
db['greenhouse1']['fruits'].append('apples')  # use `add` for sets
db['greenhouse1']['fruits'].append('oranges')
db['greenhouse1']['colors'] = ["red", "orange"]
db['greenhouse2']['fruits'].append('banana')
print(db)
# defaultdict(<function __main__.<lambda>()>,
#             {'greenhouse1': defaultdict(list,
#                          {'fruits': ['apples', 'oranges'],
#                           'colors': ['red', 'orange']}),
#              'greenhouse2': defaultdict(list, {'fruits': ['banana']})})

一个defaultdict像一个普通的字典一样工作,所以不要被奇怪的输出弄糊涂了。例如,要访问greenhouse1的水果,您可以简单地输入db['greenhouse1']['fruits'],然后返回一个列表(或集合)。

首先,您需要在字典键中的fruitscolor周围加上引号。

第二,在创建字典之前不能创建嵌套的字典元素。

您可以使用collections.defaultdict来简化代码。因为需要嵌套字典,所以需要嵌套defaultdicts。

from collections import defaultdict
namedict = defaultdict(lambda: defaultdict(set))
for row in db_rows:
namedict[row.id]['fruits'].add(row.fruit)
namedict[row.id]['colors'].add(row.color)

最新更新