减少响应转换上的if-else

2024-10-01 22:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

你能告诉我有没有更好的方法来写下面的内容来避免if和else的情况。我有一个输入结构如下

 results=[  
 {
  "id":"11",
  "category":"Employee",
  "name":"Employe11",
  "type":"contractor"
},
 {
  "id":"11",
  "category":"Employer",
  "name":"company1",
  "count":800
},
 {
  "id":"11",
},
 {
  "name":"Employe11"
}

]

我必须创建一个新的json对象,我已经编写了下面的代码,并按照预期返回结果,但我认为如果检查的if太多,是否有任何方法可以避免它,主要是if条件是添加,并且仅当值存在时才更新字典

resltlist=[]

for x in results:
  details={}
  if x.get('id', ''):
     details.update({'unique_id':x['id']})
    
  if x.get('name', ''):
     details.update({'name':x['name'])

  if x.get('type', ''):
     details.update({'emp_type':x['type'])

  if x.get('count', ''):
     details.update({'count':x['count'])
  
     if x['category']=="Employer":
        if x.get('count', ''):
          details.update({'count':x['count']})
  resultlist.append(details)

return {"results":resultlist}

欢迎提出改进此代码的建议,以及我是否可以减少if语句,谢谢

问候


Tags: 方法代码nameidgetiftypecount
3条回答

您可以添加另一个循环,将结果映射到详细信息字典

test=[]
mappings = { 'id':'unique_id', 'name':'name', 'type':'emp_type', 'count':'count' }
for x in results:
    details={}
    for key, value in mappings.items():
        if x.get(key, ''):
            details.update({value:x[key]})
    test.append(details)
print(test)
[{'unique_id': '11', 'name': 'Employe11', 'emp_type': 'contractor'}, {'unique_id': '11', 'name': 'company1', 'count': 800}, {'unique_id': '11'}, {'name': 'Employe11'}]

小心:慢。不适合>;10k记录或在线制作使用。

如果要进行一些中间的数据分析步骤,还可以使用pandasDataFrame()构造函数

df = pd.DataFrame(results)\
    .rename(columns={"id": "unique_id", "type": "emp_type"})

print(df)
  unique_id  category       name    emp_type  count
0        11  Employee  Employe11  contractor    NaN
1        11  Employer   company1         NaN  800.0
2        11       NaN        NaN         NaN    NaN
3       NaN       NaN  Employe11         NaN    NaN

丢弃NaN项的输出(与给定的resultlist相同,但顺序不同)

[sr.dropna().to_dict() for _, sr in df.iterrows()]  # slow!

输出项:

df.to_dict(orient="records")

一种直接且完全自动化的方式:

# give your rename rules here
dic_renamer = {"id": "unique_id", "type": "emp_type"}

resultlist = []
for dic in results:
    for old_name, new_name in dic_renamer.items():
        # replace old_name with new_name only if old_name exists
        if old_name in dic:
            dic[new_name] = dic[old_name]
            del dic[old_name]
    resultlist.append(dic)

结果

print(resultlist)

[{'category': 'Employee',
  'name': 'Employe11',
  'unique_id': '11',
  'emp_type': 'contractor'},
 {'category': 'Employer', 'name': 'company1', 'count': 800, 'unique_id': '11'},
 {'unique_id': '11'},
 {'name': 'Employe11'}]

相关问题 更多 >

    热门问题