【问题标题】:Converting a nested tuples into nested dictionaries将嵌套元组转换为嵌套字典
【发布时间】:2013-12-07 15:27:10
【问题描述】:

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

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)

还有:

from collections import defaultdict
dic2= defaultdict( list )
for n,v in dic1_zipped:
    fq[n].append(v)

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

【问题讨论】:

  • 为什么会有额外的方括号 - 在 dic1 中,您的值是元组列表的列表,而在 dic2 中,您的值是单个字典的列表。更好的输出不是{'persuaded': {'teacher':6, 'group':5, ...}}吗?
  • 你有一个元组列表吗?
  • @rdodev 是的,这就是我所拥有的。您认为如果我在转换为字典之前将其展平会更容易吗?
  • @user3008918 绝对。除非你需要它,否则你应该尽可能地扁平化数据结构。

标签: python python-3.x dictionary tuples


【解决方案1】:
dict((k, v) for k,v in c1.items())

【讨论】:

    【解决方案2】:

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

    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])。)

    【讨论】:

    • 确实,在包装仍然存在的情况下,这会引发ValueError: dictionary update sequence element #0 has length 4; 2 is required,因为v1 是元组列表的列表。您可能想就如何使您的代码在包装时也能正常工作向 OP 提供建议。
    • 谢谢,添加了额外列表级别的说明
    【解决方案3】:

    以下嵌套的 dict 和列表推导将为您完成:

    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 ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}], 'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}]}
    >>> from pprint import pprint
    >>> pprint(_)
    {'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}],
     'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}]}
    

    我真的很惊讶你不希望每个值都有 一个 字典:

    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'}}
    

    【讨论】:

    • 用户有一个元组列表,所以这个 wolution 行不通。
    • @rdodev:注意value[0],最重要的是演示。它工作得很好。无论如何,我现在更新它以处理更多子列表。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 2019-12-28
    • 1970-01-01
    • 2020-09-03
    • 2021-06-14
    • 2022-12-05
    • 2018-02-16
    相关资源
    最近更新 更多