我有一个输入嵌套字典,如下所示:
{'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
我期望的输出如下:
[{'name': 'Mark', 'english':23, 'maths':35}, {{'name': 'Mark', 'english':50, 'maths':55}]
我的代码如下:
In [22]: input = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
In [23]: marks = input.pop('marks')
In [24]: output = []
In [25]: for mark in marks:
...: output.append({**input, **mark})
...:
In [26]: output
Out[26]:
[{'english': 20, 'maths': 25, 'name': 'Mark'},
{'english': 50, 'maths': 55, 'name': 'Mark'}]
按预期工作。但是,此功能仅适用于python 3.5及更高版本,因为 {** x,** y} 仅是从该版本开始引入的。
我的数据集也很大,我不确定这是否是实现此目标的最有效方法,什么是实现此python 2.7的最佳方法?我也愿意使用Pandas
和numpy
之类的外部库。
答案 0 :(得分:1)
这里使用pandas
的解决方案:
import pandas as pd
x = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
x = pd.DataFrame(x)
x = pd.concat([x['name'],x['marks'].apply(pd.Series)], axis=1)
print(x.to_dict(orient='records'))
输出:
[{'english': 20, 'name': 'Mark', 'maths': 25},
{'english': 50, 'name': 'Mark', 'maths': 55}]
PS:已在python3上测试,但它也应在python2.7上工作
修改
带有附加密钥的通用解决方案 现在,您不必对其他键进行硬编码。
x = {'name': 'Mark', 'add':'Mum','marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
x = pd.DataFrame(x)
cols = list(x.columns)
cols.remove('marks') # to get columns except `mark`
x = pd.concat([x[cols],x['marks'].apply(pd.Series)], axis=1)
print(x.to_dict(orient='records'))
答案 1 :(得分:1)
尽管列表列表很脏,但返回的结果可能很简单:
input = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
marks_list = input.pop('marks')
output = [marks.update(input) or marks for marks in marks_list]
[{'name': 'Mark', 'maths': 25, 'english': 20}, {'name': 'Mark', 'maths': 55, 'english': 50}]
答案 2 :(得分:0)
我会使用pydash(https://pydash.readthedocs.io/en/latest/),它支持python 2.7:
from pydash import py_ as _
inputs = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
def construct_dict(d1, d2):
d1.update(d2)
return d1
_(inputs['marks']).map(lambda x: construct_dict({ 'name': inputs['name'] }, x)).value()
# output
[{'maths': 25, 'name': 'Mark', 'english': 20}, {'maths': 55, 'name': 'Mark', 'english': 50}]
答案 3 :(得分:0)
在python2.7中,我将执行以下操作:
input = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
marks = input.pop('marks')
output = map(lambda x:dict(input, **x), marks)
答案 4 :(得分:0)
使用python 2.7:
idict = {'name': 'Mark', 'marks':[{'english':20, 'maths':25},{'english':50, 'maths':55}]}
print (idict)
marks = idict.pop("marks")
result = []
for each in marks:
result.append({'name': idict['name']})
for key, val in each.items():
result[-1][key] = val
print (result)
{'name': 'Mark', 'marks': [{'maths': 25, 'english': 20}, {'maths': 55, 'english': 50}]}
[{'maths': 25, 'name': 'Mark', 'english': 20}, {'maths': 55, 'name': 'Mark', 'english': 50}]