我正在尝试优化我的代码,并且发现了有关理解的知识。但是我在我的代码以及如何应用字典理解方面苦苦挣扎。 原始代码如下。
如何以适当的pythonic方式优化此代码?
all_users = []
for x in range(len(result)):
user = {}
user["fieldy"] = str(result[x][1].get("valueforfield1", None))[3:-2]
user["fieldx"] = str(result[x][1].get("valueforfield2", None))[3:-2]
user["fieldc"] = str(result[x][1].get("valueforfield3", None))[3:-2]
user["fieldv"] = str(result[x][1].get("valueforfield4", None))[3:-2]
user["fieldb"] = str(result[x][1].get("valueforfield5", None))[3:-2]
all_users.append(user)
结果示例值
result = [('CN=Xxx X,OU=X,OU=X,DC=X,DC=X', {'valueforfield1': [b'Va'], 'valueforfield2': [b'val'], 'valueforfield3': [b'+123'], 'valueforfield4': [b'65@test.com'], 'valueforfield5': [b'examplevalue']}),('CN=Yyy Y,OU=Y,OU=Y,DC=Y,DC=Y', {'valueforfield1': [b'Ycx'], 'valueforfield2': [b'Dy'], 'valueforfield3': [b'+321'], 'valueforfield4': [b'64@test.com'], 'valueforfield5': [b'examplevaluey']})]
在执行代码后,user
字典在for循环的第一次迭代之后具有以下内容
{"fieldy": "Va", "fieldx": "val", "fieldc": "+123", "fieldv": "65@test.com", "fieldb": "examplevalue"}
我还应该编写一个函数来替换user["field1"] = str(result[x][1].get("valueforfield1", None))[3:-2]
代码吗?值得值得推荐吗?
谢谢!
答案 0 :(得分:1)
仅使用dict理解即可处理重复的代码:
all_users = []
for x in range(len(result)):
user = {f"field{i}": str(result[x][1].get(f"valueforfield{i}", None))[3:-2] for i in range(1, 7)}
all_users.append(user)
同时使用列表推导和字典推导来完成所有操作:
all_users = [{
f"field{i}": str(result[x][1].get(f"valueforfield{i}", None))[3:-2]
for i in range(1, 7)
} for x in range(len(result))]
您提供的示例中的难点在于键的名称-但由于键的名称是常规的,因此我使用格式字符串仅插入键期望的整数(即f"field{i}"
解析为{ {1}时为"field1"
,{{1}时为i = 1
,依此类推)。
通常,理解并不能真正优化速度-它们更多地是为了避免代码重用。
答案 1 :(得分:1)
采用精心设计的方法:
result = [('CN=Xxx X,OU=X,OU=X,DC=X,DC=X',
{'valueforfield1': [b'Va'], 'valueforfield2': [b'val'], 'valueforfield3': [b'+123'],
'valueforfield3': [b'65@test.com'], 'valueforfield5': [b'examplevalue']}),
('CN=Yyy Y,OU=Y,OU=Y,DC=Y,DC=Y',
{'valueforfield1': [b'Ycx'], 'valueforfield2': [b'Dy'],
'valueforfield3': [b'+321'], 'valueforfield3': [b'64@test.com'],
'valueforfield5': [b'examplevaluey']})]
def compose_user_details(data):
keys_map = {"fieldy": "valueforfield1", "fieldx": "valueforfield2",
"fieldc": "valueforfield3", "fieldv": "valueforfield4",
"fieldb": "valueforfield5", "fieldn": "valueforfield6",
}
user_details = []
for i in range(len(result)):
dataset = result[i][1] # getting the needed `data source` at once
user_details.append({k: str(dataset.get(v, None))[3:-2]
for k,v in keys_map.items()})
return user_details
print(compose_user_details(result))
输出:
[{'fieldy': 'Va', 'fieldx': 'val', 'fieldc': '65@test.com', 'fieldv': '', 'fieldb': 'examplevalue', 'fieldn': ''}, {'fieldy': 'Ycx', 'fieldx': 'Dy', 'fieldc': '64@test.com', 'fieldv': '', 'fieldb': 'examplevaluey', 'fieldn': ''}]