我有一个Dict“样本”,我想将所需的项目从“样本”保存到另一个Dict样本1。
我的词典就像
sample=[{
'Name':'n1',
'SNo':1,
'Status':{
'state':'None',
'Health':'Ok'
},
'Contact':'No'
'Address':'No'
},
{
'Name':'n2',
'SNo':2,
'Status':{
'state':'Present',
'Health':'Ok'
},
'Contact':'Yes'
'Address':'Not Provided'
},
{
'Name':'n3',
'SNo':3,
'Status':{
'state':'None',
'Health':'Ok'
},
'Contact':'No'
'Address':'Provided'
}]
从上面的Dict(示例)中,我要将项目(“名称”,“ SNo”,“状态”)保存到另一个Dict(示例1)中。
预期结果应该是
sample1={
'Details':{
'Name':'n1',
'SNo':1,
'Status':{
'state':'None',
'Health':'Ok'
}
},
{
'Name':'n2',
'SNo':2,
'Status':{
'state':'Present',
'Health':'Ok'
}
},
{
'Name':'n3',
'SNo':3,
'Status':{
'state':'None',
'Health':'Ok'
}
}
}
我尝试过
Sample1={}
res={}
for data in sample:
if data.has_key('Name') and data.has_key('SNo') and data.has_key('Status'):
res['Name']=data['Name']
res['SNo']=data['SNo']
res['Status']=data['Status']
sample1['Details']=res
#sample1['Details'].update(res)
但这只是给我一个结果集,所有结果都覆盖了这一点。
'Details':{
{
'Name':'n3',
'SNo':3,
'Status':{
'state':'None',
'Health':'Ok'
}
}
}
并且还尝试使用'update()',但是它抛出了关键错误'Details'
sample1['Details'].update(res)
有人可以帮我吗...
答案 0 :(得分:0)
首先,将has_key
(仅适用于Python 2)替换为in
(适用于Python 2和3)。参见https://www.python.org/dev/peps/pep-0373/。
第二,对于具有正确密钥的每个数据,您将覆盖映射到Details
的值:这就是为什么仅获得最后结果的原因。 Details
应该映射到列表。
第三,对具有正确键的每个数据使用相同的(可变)值res
:即使您使用列表,也将是最后一个值的n
倍。
通过以下方式替换您的代码:
sample1={'Details': []} # an empty list
# don't create res here
for data in sample:
if 'Name' in data and 'SNo' in data and 'Status' in data:
res={} # but here: a new res per data
res['Name']=data['Name']
res['SNo']=data['SNo']
res['Status']=data['Status']
sample1['Details'].append(res) # append the current res
更多的pythonic代码将是:
required = set(['Name', 'SNo', 'Status'])
details = []
for data in sample:
try:
details.append({field: data[field] for field in required})
except KeyError:
pass
sample1 = {'Details': details}
或具有列表理解:
required = set(['Name', 'SNo', 'Status'])
details = [{field: data[field] for field in required}
for data in sample
if set(data) >= required]
sample1 = {'Details': details}