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

时间:2015-04-11 09:35:02

标签: python database loops dictionary flask-sqlalchemy

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

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   |
+-----------------+----------+----------+-------+

4 个答案:

答案 0 :(得分:0)

首先应该在元组列表([('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 

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

等等。希望这有帮助

答案 3 :(得分:0)

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