python-2.7 - 将所需项目从一个字典保存到另一个字典
问题描述
我有一个字典“样本”,我想将所需项目从“样本”保存到另一个字典样本 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'
}]
从上面的字典(示例)中,我想将项目('Name','SNo','Status')保存到另一个字典(sample1)中。
预期的结果应该是,
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'
}
}
}
并且还尝试使用“更新()”,但它给我带来了关键错误“详细信息”
sample1['Details'].update(res)
任何人都可以帮我解决这个问题...
解决方案
首先,将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}