【问题标题】:Convert List of Dictionaries to nested list of dictionaries (with duplicate values merged)将字典列表转换为嵌套的字典列表(合并重复值)
【发布时间】:2021-02-12 12:19:54
【问题描述】:

使用字典列表,我想创建一个嵌套的列表字典。

示例数据:

 data = [ { 'State': 'IL', 'City': 'Chicago', 'Schools': [ 'school_a', 'school_b' ] },
          { 'State': 'IL', 'City': 'Chicago', 'Schools': [ 'school_c', 'school_d' ] },
          { 'State': 'IL', 'City': 'Evanston', 'Schools': [ 'school_x', 'school_y' ] }]

所需的输出数据:

new_data = { 'IL' : [ 'Chicago'  : { 'Schools': ['school_a', 'school_b', 'school_c', 'school_d'] },
                      'Evanston' : { 'Schools : ['school_x', 'school_y'] } ] }

实现这一目标的最有效方法是什么?

---> 编辑如下:

@Samwise 下面的解决方案非常适合上述示例。

如果我们将 Schools 做成一个哈希值并想创建如下所示的内容会怎样:

我们该怎么做呢?

#Example data:

 data = [ { 'State': 'IL', 'City': 'Chicago', 'Schools': { 'high' : 'school_a', 'midddle' : 'school_b' } },
          { 'State': 'IL', 'City': 'Chicago', 'Schools': { 'high' : 'school_c', 'middle' :'school_d' } },
          { 'State': 'IL', 'City': 'Evanston', 'Schools': { 'high' :'school_x', 'middle' : 'school_y' } }]

#Desired output data:

new_data = { 'IL' : [ 'Chicago'  : [ { 'Schools': {'high': 'school_a', 'middle': 'school_b'} },
                                    { 'Schools': {'high': 'school_c', 'middle': 'school_d'} } ],
                     'Evanston' : { 'Schools : {'high': 'school_x', 'middle': 'school_y'} } ] }

【问题讨论】:

    标签: python list python-2.7 dictionary nested


    【解决方案1】:

    我会使用defaultdict 以便在您遍历原始data 时轻松地将元素添加到字典中:

    >>> new_data = defaultdict(lambda: defaultdict(lambda: {'Schools': []}))
    >>> for row in data:
    ...     new_data[row['State']][row['City']]['Schools'].extend(row['Schools'])
    

    【讨论】:

    • 谢谢,@Samwise :D 我已经用后续问题编辑了帖子。您对新问题有什么建议/建议吗?谢谢!!
    • 如果您理解第一个问题的答案,那么对第二个问题应用相同的方法应该很容易。 :)
    • 所以我尝试了 "new_data = collections.defaultdict(lambda: collections.defaultdict(lambda: { 'data': collections.defaultdict(dict)}))" 但在这种情况下,First Chicago 得到了被第二个芝加哥覆盖我想一个更合适的问题是:有没有办法不知道键的唯一性并动态地将结构变成列表?或者您是否需要在结构声明中预先知道这一点? (在这种情况下,我是否只需要列出所有词典列表?)-
    • 如果您在编写代码时知道data 的结构,那么构建一个具有相同结构的嵌套defaultdict 很简单,这样您就可以将条目插入其中一次操作。可以在运行时找出它,但这是一个不同(更难)的问题——您需要使用 isinstance 遍历它,以确定每个元素是字典、列表还是标量,然后有条件地构建 @ 987654327@逐件匹配。可行,但远远超过三行代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2016-06-16
    • 1970-01-01
    • 2022-11-04
    • 2020-09-03
    相关资源
    最近更新 更多