Python 将嵌套元组转换为嵌套字典

Python 将嵌套元组转换为嵌套字典,python,python-3.x,dictionary,tuples,Python,Python 3.x,Dictionary,Tuples,我有一个字典列表,其中包含一些元组作为其值: dic1 = { 'persuaded ': [[('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')]], 'removed ': [[('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]] } 我需要做的是将嵌套的元组转换成字典,这样我就可以在以后使用键将它与其他类似的列表进行比较。

我有一个字典列表,其中包含一些元组作为其值:

dic1 = {
    'persuaded ': [[('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')]], 
    'removed ': [[('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]]
}
我需要做的是将嵌套的元组转换成字典,这样我就可以在以后使用键将它与其他类似的列表进行比较。理想的结果是:

dic2 = {
    'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}], 
    'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}]
} 
我试过:

dic2 = {}
for x, y in dic1_zipped:
    d.setdefault(x, []).append(y)
以及:


但这两个词在词典中都不够深入。我真的很感激任何关于如何解决这个问题的建议!谢谢

以下嵌套的dict和list理解将为您提供:

dic2 = {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()}
演示:

实际上,我很惊讶您不希望每个值都有一本字典:

dic2 = {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}
产生:

>>> {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}
{'removed ': {'stain': '4', 'trash': '4', 'apple': '5', 'makeup': '4'}, 'persuaded ': {'group': '5', 'teacher': '6', 'man': '5', 'girl': '5'}}
>>> pprint(_)
{'persuaded ': {'girl': '5', 'group': '5', 'man': '5', 'teacher': '6'},
 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}

以下嵌套的dict和list理解将为您提供帮助:

dic2 = {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()}
演示:

实际上,我很惊讶您不希望每个值都有一本字典:

dic2 = {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}
产生:

>>> {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}
{'removed ': {'stain': '4', 'trash': '4', 'apple': '5', 'makeup': '4'}, 'persuaded ': {'group': '5', 'teacher': '6', 'man': '5', 'girl': '5'}}
>>> pprint(_)
{'persuaded ': {'girl': '5', 'group': '5', 'man': '5', 'teacher': '6'},
 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}

如果你摆脱了不必要的列表包装,即

dic1 = {'persuaded ': [('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')], 'removed ': [('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]}
你可以很简单地做到这一点:

dic2 = dict((k1, dict(v1)) for k1, v1 in dic1.items())
这给

{'persuaded ': {'girl': '5', 'man': '5', 'group': '5', 'teacher': '6'}, 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}
这似乎比单条词典列表更有用


(如果您无法摆脱额外级别的列表,请使用
dict(v1[0])

如果您摆脱了不必要的列表包装,即

dic1 = {'persuaded ': [('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')], 'removed ': [('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]}
你可以很简单地做到这一点:

dic2 = dict((k1, dict(v1)) for k1, v1 in dic1.items())
这给

{'persuaded ': {'girl': '5', 'man': '5', 'group': '5', 'teacher': '6'}, 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}
这似乎比单条词典列表更有用


(如果您无法摆脱额外级别的列表,只需使用
dict(v1[0])

为什么要有额外的方括号-在dic1中,您的值是元组列表,而在dic2中,您的值是单个词典的列表。更好的输出不是
{'consuved':{'teacher':6,'group':5,…}
?你有一个元组列表吗?@rdodev是的,这就是我的。你认为在转换成字典之前我把它压平会更容易吗?@user3008918当然。除非你需要它,否则你应该尽可能扁平化数据结构。为什么你有额外的方括号-在dic1中,你的值是元组列表,而在dic2中,你的值是单个词典列表。更好的输出不是
{'consuved':{'teacher':6,'group':5,…}
?你有一个元组列表吗?@rdodev是的,这就是我的。你认为在转换成字典之前我把它压平会更容易吗?@user3008918当然。除非您需要它,否则您应该尽可能扁平化数据结构。用户有一个元组列表,因此此解决方案不起作用。@rdodev:请注意
值[0]
,最重要的是演示。它很好用。无论如何,我现在更新了它来处理更多的子列表。用户有一个元组列表,所以这个方法不起作用。@rdodev:注意
值[0]
,最重要的是,还有演示。它很好用。无论如何,我现在更新了它来处理更多的子列表;2是必需的,因为v1是元组列表的列表。您可能希望就如何使代码即使在包装的情况下也能工作向OP提供建议。谢谢,为额外的列表级别添加了一个说明确实,在包装仍然存在的情况下,这会引发一个
ValueError:dictionary update sequence元素#0的长度为4;2是必需的,因为v1是元组列表的列表。您可能希望就如何使代码即使在包装时也能工作向OP提供建议。谢谢,为额外的列表级别添加了说明