将所需项目从一个词典保存到另一个词典

时间:2019-09-12 02:30:43

标签: python-2.7 dictionary

我有一个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)

有人可以帮我吗...

1 个答案:

答案 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}