解压包含字典列表的字典并插入列中

Unpack dictionary that contains a list of dictionaries and insert in columns

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

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

...等等。

我看起来 here, here, and here among other places, but couldn't find something close enough to what I want to do. 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   |
+-----------------+----------+----------+-------+

您应该首先对元组列表 ([('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 
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]}

尝试使用 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']}

所以on.Hope这有帮助

您可以将 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]}