Оптимизировать код с помощью словарного понимания - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь оптимизировать свой код, и я узнал о пониманиях.Но я борюсь со своим кодом и с тем, как применять словарь для понимания.Оригинальный код ниже.

Как оптимизировать этот код надлежащим питонским способом?

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]?Стоит ли это и рекомендуется?Спасибо!

Ответы [ 2 ]

1 голос
/ 07 июня 2019

При правильном подходе:

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': ''}]
1 голос
/ 07 июня 2019

Используя только понимание слова, чтобы позаботиться о повторяющемся коде:

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}" разрешается в "field1", когда i = 1, "field2", когда i = 2 и т. Д.).


В целом, на самом деле понимание не оптимизируется по скорости - оно больше для предотвращения повторного использования кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...