python - Python字典交换键:值存在于多个键中时的值对
问题描述
我有一个字典,每个键中有多个值。我想反转字典,以便可以将不同键中存在的所有值存储在Value:Keys对中(请记住,一个值可以存在于多个键上)。
样本数据 :
{
"1A": [
"mathematics"
],
"1B": [
"problem-solving",
"model"
],
"1C": [
"basic",
"model"
]
}
输出 :
{
"mathematics": [
"1A"
],
"problem-solving": [
"1B"
],
"model" : [
"1B" ,
"1C"
],
"basic": [
"1C",
]
}
如您所见,MODEL 现在有 2 个值 1B 和 1C。
我尝试了不同的方法,但似乎都认为 Key:Values 必须是唯一的。以下所有方法均在上述情况下失败。
方法一:
my_dict2 = {y:x for x,y in instr_dict.iteritems()}
instr_json = json.dumps(new_dict)
print(instr_json)
方法2:
my_dict2 = dict((y,x) for x,y in instr_dict.items())
instr_json = json.dumps(new_dict)
print(instr_json)
方法3:
b = dict()
for k, v in instr_dict.items(): # a.iteritems() in python 2
b[v] = k
del instr_dict[k]
a = b
print(a)
有人可以用正确的方法来解决这个问题吗?
解决方案
只需遍历字典即可。如果新键在字典中,则附加该值,否则使用该值创建一个列表。
这是工作代码。
newDict = {}
for key,value in instr_dict.items():
for val in value:
if val in newDict:
newDict[val].append(key)
else:
newDict[val] = [key]
print(newDict)
推荐阅读
- spring - 通过 Thymeleaf 模板在 SPRING 应用程序中传递更改的子对象的问题
- ruby-on-rails - 如何使用 jbuilder 创建此自定义 JSON 布局
- vue.js - 如何在 Vuex 中正确混合和隔离对象
- java - 使用身份验证的 HttpGet 调用
- c++ - 有没有一种标准方法来使用 std::basic_string 与堆栈分配的缓冲区大小大于 SSO,而不是堆
- eclipse - 将参数快速传递给 Eclipse 中的程序
- angular - 提前输入:Observable.create(...).mergeMap 不是函数
- python-3.x - 在 Python 中使用最小化估计参数并加快此过程
- c# - 什么时候应该使用 public、private 或 [SerializeField]?统一 C#
- android - 失败 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
在 Android 上运行 cordova 应用程序时权限为空