首页 > 解决方案 > 将所需项目从一个字典保存到另一个字典

问题描述

我有一个字典“样本”,我想将所需项目从“样本”保存到另一个字典样本 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)

任何人都可以帮我解决这个问题...

标签: python-2.7dictionary

解决方案


首先,将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}

推荐阅读