python - 从一个元组和另一个字典的键初始化一个新字典
问题描述
我正在尝试使用来自元组 [the values of] 的键来构建字典,这些键的值应该是由字典的键和初始化为0
.
元组看起来像:
characters = ('Fred', 'Sam', 'Bob', 'Daisy', 'Gina', 'Rupert')
涉及的字典如下所示:
jobs = {
'Pizzeria': 1,
'Mall Kiosk': 2
'Restaurant': 3
'Burger Joint': 4
'Department Store': 5
}
我希望最终结构看起来像:
jobsWorkedCounter = {
'Fred': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
'Sam': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
...
'Rupert': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
}
最终目标是有一个递增计数器的结构:
jobsWorkedCounter['Fred']['Burger Joint'] += 1
我尝试过使用各种嵌套理解:
jobsWorkedCounter = { char: dict((key, 0) for key in jobs.keys()) for char in characters }
# and
jobsWorkedCounter = { char: dict(jobs.keys(), 0) for char in characters }
# and
jobsWorkedCounterDict = { key: 0 for key in jobs.keys() }
jobsWorkedCounter = { char: jobsWorkedCounterDict for char in characters }
# and
jobsWorkedCounter = { char: { key: 0 for key in jobs.keys() } for char in characters }
和一个简单的for
循环:
jobsWorkedCounter = { char: {} for char in characters }
for char in characters:
jobsWorkedCounter[char] = dict.fromkeys(jobs.keys(), 0)
但我能做到的最好的是单个子键而不是全套:
jobsWorkedCounter = {
'Fred': {
'Pizzeria': 0,
},
'Sam': {
'Pizzeria': 0,
},
...
'Rupert': {
'Pizzeria': 0,
},
}
似乎无论我尝试什么,我都设法将新字典扁平化为单个键值对,这就是从元组中分配给键的内容。
我怎样才能完成我想做的事情?
另外,以防万一我做错了,检查输出我这样做:
keys = jobsWorkedCounter['Fred'].keys()
raise Exception(keys)
这让我:
Exception: [u'Pizzeria']
我希望看到的地方:
Exception: [u'Pizzeria', u'Mall Kiosk', u'Restaurant', u'Burger Joint', u'Department Store']
我相当确定这种查看密钥的方法应该有效,因为如果我将其更改为:
keys = jobsWorkedCounter.keys()
raise Exception(keys)
我得到:
Exception: [u'Fred', u'Sam', u'Bob', u'Daisy', u'Gina', u'Rupert']
附录
我在 Ren'Py 环境中使用 Python 2.7(因此引发异常以查看输出的原因)。
例如:
from pprint import pprint
给我:
Import Error: No module named pprint
解决方案
使用 dict 理解:
characters = ('Fred', 'Sam', 'Bob', 'Daisy', 'Gina', 'Rupert')
jobs = {
'Pizzeria': 1,
'Mall Kiosk': 2,
'Restaurant': 3,
'Burger Joint': 4,
'Department Store': 5
}
jobsWorkedCounter = {c: {k: 0 for k in jobs} for c in characters}
# For pretty print:
#from pprint import pprint
#pprint(jobsWorkedCounter)
print(jobsWorkedCounter)
印刷:
{'Bob': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Daisy': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Fred': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Gina': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Rupert': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Sam': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0}}
编辑:另一个明确的版本:
zeroed_jobs = dict((k, 0) for k in jobs)
jobsWorkedCounter = {c: dict(**zeroed_jobs) for c in characters}
print(jobsWorkedCounter)
推荐阅读
- c# - .Net Core 文件流问题
- c# - 是否可以使用普通的 mvc 控制器和 api 控制器创建一个混合的 asp.net 核心 MVC
- java - 当内部标记与外部标记同名时,“MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”
- json - 书架:查询生成器:如何将like 运算符与json 列一起使用?
- c# - 实体的动态代理/延迟加载在 ef6 中并非一直有效
- angular - Angular 6,每隔几秒调用一次 API 或每隔几秒从订阅接收新数据
- github - 将文件夹的内容推送到存储库内的文件夹中?
- c++ - 编译器错误(Intel Parallel Studio 2019 与 Visual Studio Community 2019)
- python - 如何创建一个空的 python 包?
- azure - Azure Bastion - 跨对等网络访问 VM?