解压包含字典列表的字典并插入列中
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这有帮助
您可以将 themes
、count
和 score
保存在一本字典中 -- 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]}
使用下面的数据,我试图展开一个包含字典列表的字典,然后将每个键与其他字典的相应值组合在一起。例如:
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这有帮助
您可以将 themes
、count
和 score
保存在一本字典中 -- 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]}