首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python嵌套字典-用defaultdict解决(lambda: defaultdict(set))

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

Stack Overflow用户
提问于 2022-06-08 20:22:45
回答 2查看 105关注 0票数 -1

用python方法在其他语言中这样做了数百万次,因为这是在逃避我。

从数据库中读取一些数据。包括ID、水果、颜色、名称等数据

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

代码语言:javascript
复制
{"greenhouse1": {"fruits": {"apples", "oranges"}
                {"colors": {"red","orange"}}

我正在逐行遍历db,名称键将出现不止一次。当它做了,水果或颜色可能已经填充,并需要追加。

代码语言:javascript
复制
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]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-08 20:44:12

collections.defaultdict是您的朋友:如果您访问一个defaultdict的新键,它将自动使用提供的函数初始化(本例中为listset )。因为您需要字典(例如"greenhouse1")中的字典(“水果”、“颜色”),并将列表作为值(单独的水果和颜色),所以我们需要一个嵌套的默认字典。下列措施应能发挥作用:

代码语言:javascript
复制
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'],就可以得到一个列表(或设置)。

票数 2
EN

Stack Overflow用户

发布于 2022-06-08 20:34:49

首先,您需要字典键中的fruitscolor引号。

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

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72551776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档