用python方法在其他语言中这样做了数百万次,因为这是在逃避我。
从数据库中读取一些数据。包括ID、水果、颜色、名称等数据
我需要在名字上创建一个对象/字典键。名称则保存水果和颜色的列表/字典。
{"greenhouse1": {"fruits": {"apples", "oranges"}
{"colors": {"red","orange"}}我正在逐行遍历db,名称键将出现不止一次。当它做了,水果或颜色可能已经填充,并需要追加。
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]发布于 2022-06-08 20:44:12
collections.defaultdict是您的朋友:如果您访问一个defaultdict的新键,它将自动使用提供的函数初始化(本例中为list或set )。因为您需要字典(例如"greenhouse1")中的字典(“水果”、“颜色”),并将列表作为值(单独的水果和颜色),所以我们需要一个嵌套的默认字典。下列措施应能发挥作用:
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'],就可以得到一个列表(或设置)。
发布于 2022-06-08 20:34:49
首先,您需要字典键中的fruits和color引号。
其次,在创建字典之前,不能创建嵌套的字典元素。
您可以使用collections.defaultdict简化代码。因为您需要嵌套字典,所以需要嵌套的默认字典。
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)https://stackoverflow.com/questions/72551776
复制相似问题