【问题标题】:Unpack dictionary that contains a list of dictionaries and insert in columns解压包含字典列表并插入到列中的字典
【发布时间】:2015-04-11 09:35:02
【问题描述】:

使用下面的数据,我试图展开一个包含字典列表的字典,然后将每个键与其他字典的相应值组合在一起。例如:

result = {
    'themes' : [{
            'a' : 'orange',
            'b' : 6,
            'c' : 'neutral',
            'd' : 6,
            'e' : 0.24
        }, {
            'a' : 'banana',
            'b' : 6,
            'c' : 'neutral',
            'd' : 6,
            'e' : 0.16
        }, {
            'a' : 'phone',
            'b' : 5,
            'c' : 'neutral',
            'd' : 5,
            'e' : 0.02
        }
    ]
}

...应该变成这样的东西:

themes={'a' : ['orange','banana', 'phone']}

count={'b' : [6,6,5]}

s_score={'c' : [neutral, neutral, neutral]}

...等等。

我查看了hereherehere 等其他地方,但找不到与我想做的足够接近的东西。 This 非常接近,但它正在检查至少一个或多个常用值,而我的应该对常用键进行分组。我知道我可以将外部键与这样的值分开:

>>>(k, v), = result.items()
>>>k
>>>'themes'
>>>v
>>>[{
        'a' : 'orange',
        'b :6,
        'c' : 'neutral',
        'd' : 6,
        'e' : 0.24
    }, {
        'a' : 'banana',
        'b' : 6,
        'c' : 'neutral',
        'd' : 6,
        'e' : 0.16
    }, {
        'a' : 'phone',
        'b' : 5,
        'c' : 'neutral',
        'd' : 5,
        'e' : 0.02
    }
]

但是如何按照我描述的方式获得 v 字典列表?我必须先将它们转换为集合吗?

为了明确我的意图,我的最终目标是遍历我想要保留的键的值列表,这样我就可以将它们输入到我相当基本的 flask-sqlalchemy SQLite 数据库中它们各自的列中。所以最后我将能够查询并将它们显示为html:

+-----------------+----------+----------+-------+
|       a         |    b     |    c     |   d   |
+-----------------+----------+----------+-------+
|     orange      |   2.4    | neutral  |   6   |
|     banana      |   1.6    | neutral  |   6   |
+-----------------+----------+----------+-------+

【问题讨论】:

    标签: python database loops dictionary flask-sqlalchemy


    【解决方案1】:
    dict1 = {}
    for eachKey in list(set(",".join(each.keys()) for each in result["themes"]))[0].split(","):
        dict1[eachKey] = [each[eachKey] for each in result["themes"]]
    print dict1
    

    它会将您的result 减少为以下字典-

    {'a': ['orange', 'banana', 'phone'], 'c': ['neutral', 'neutral', 'neutral'], 'b': ['6', 6, 5], 'e': [0.24, 0.16, 0.02], 'd': [6, 6, 5]}
    

    【讨论】:

    • 您的代码和 Saksham 的代码运行良好,谢谢!我用的是前者。 ipoteka 的解决方案也有效,但由于某种原因,当我有大量字典项目时,它也在第一个元素处给了我原始格式。
    【解决方案2】:

    使用defaultdict试试这个

    from collections import defaultdict
    d = defaultdict(list)
    for i,j in result.iteritems():
        for k in j:
            for l,m in k.iteritems():
                d[l].append(m)
    >>>d
    defaultdict(<type 'list'>, {'a': ['orange', 'banana', 'phone'], 'c': ['neutral', 'neutral', 'neutral'], 'b': ['6', 6, 5], 'e': [0.24, 0.16, 0.02], 'd': [6, 6, 5]})
    

    现在你可以解析它了

    themes = {'a':d['a']}    
    >>>themes
    {'a': ['orange', 'banana', 'phone']}
    

    等等。希望这会有所帮助

    【讨论】:

    • 看起来不错,但我还没有让它工作,因为我使用的是 Python 3,它不支持 dict.iteritems()
    • 所以你可以使用dict.items()
    【解决方案3】:

    您可以将themescountscore 保存在一本字典中——final_dict。 在代码中:

    >>> lst = result['themes']
    >>> final_dict = {}
    
    >>> for d in lst:
    ...    for (k, v) in d.items():
    ...        final_dict.setdefault(k, []).append(v)
    >>> print final_dict
    
    {'a': ['orange', 'banana', 'phone'], 'c': ['neutral', 'neutral', 'neutral'], 'b': [6, 6, 5], 'e': [0.24, 0.16, 0.02], 'd': [6, 6, 5]}
    

    【讨论】:

      【解决方案4】:

      您应该首先在元组列表 ([('a', 'orange'), ('c', 'neutral'), ('b', '6')..]) 中对所有值进行平面映射,然后按第一个元素进行分组。我会这样做:

      import itertools
      
      pairs =  itertools.chain.from_iterable([d.items() for d in result["themes"]])
      result = {}
      for key, elem in pairs:
          result.setdefault(key, []).append(elem)
      print result 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-14
        • 2021-07-10
        • 1970-01-01
        • 2019-01-11
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        相关资源
        最近更新 更多