使用字典理解优化代码

2024-09-26 05:01:14 发布

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

我试图优化我的代码,我发现了关于理解。但是我正在努力学习我的代码以及如何应用字典理解。 原始代码如下。你知道吗

如何以一种合适的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]代码吗?值得推荐吗? 谢谢!你知道吗


Tags: 代码testcomnonegetouresultdc
2条回答

仅使用听写理解来处理重复的代码:

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))]

您提供的示例中的困难在于键的名称—但由于它们是常规的,所以我使用了一个格式字符串来插入键所期望的整数(即,当i = 1f"field{i}"解析为"field1",当i = 2"field2",等等)。你知道吗


一般来说,理解并不是为了提高速度而进行优化,而是为了避免代码重用。你知道吗

采用充分考虑因素的方法:

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': ''}]

相关问题 更多 >