Как назначить значения в лямбда-функции в Python? - PullRequest
3 голосов
/ 06 апреля 2020

Я использую лямбда-функцию, чтобы мой код был оптимизирован и быстрее. Ниже я написал некоторую функцию.

a = [{"objId":"5c077187fe506f8dd3589ce6","userid":"absurana","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD","userType":"User"},
 {"objId":"5d9d7ce6fe506f11b275d01b","userid":"accheung","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD",,"userType":"User"},
 {"objId":"5d9d7ce6fe506f11b275d01b","userid":"accheung","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD","userType":"User"}]

def function_apply(a):
    for d in a:
        if 'userid' in d:
            d['UserId'] = d.pop('userid')
        if 'userType' in d:
            d['User Type'] = d.pop('userType')
        if 'usrRole' in d:
            d['Role'] = d.pop('usrRole')
        if 'tiles' in d:
            d['Tiles'] = d.pop('tiles')
    return a

Теперь я хочу преобразовать ту же самую функцию выше в лямбду, используя карту, но получаю ошибку. Как мне этого добиться?

Ответы [ 3 ]

4 голосов
/ 06 апреля 2020

Однострочный, лаконичный, pythoni c путь:

mapping = {"userid": "UserId", "userType": "User Type", "usrRole": "Role", "tiles": "Tiles"}  
def rename(x): return [{mapping.get(k, k):v for (k,v) in d.items()} for d in x]

Обратите внимание, что использование lambda не дает никакого выигрыша времени вычислений. Что касается читабельности, стандарт def является наиболее ожидаемым вызовом для определения функции.

>>> rename(a)

[{'objId': '5c077187fe506f8dd3589ce6',
  'UserId': 'absurana',
  'firstName': 'Null',
  'Role': 'Software Quality User',
  'lastName': 'Null',
  'Tiles': 'Potential CFD',
  'User Type': 'User'},
 {'objId': '5d9d7ce6fe506f11b275d01b',
  'UserId': 'accheung',
  'firstName': 'Null',
  'Role': 'Software Quality User',
  'lastName': 'Null',
  'Tiles': 'Potential CFD',
  'User Type': 'User'},
 {'objId': '5d9d7ce6fe506f11b275d01b',
  'UserId': 'accheung',
  'firstName': 'Null',
  'Role': 'Software Quality User',
  'lastName': 'Null',
  'Tiles': 'Potential CFD',
  'User Type': 'User'}]
3 голосов
/ 06 апреля 2020

То, что у вас есть сейчас, настолько эффективно, насколько вы можете получить. Если вы хотите сделать код менее повторяющимся , вы можете сделать что-то вроде

key_map = {
    'userid': 'UserId',
    'userType': 'User Type',
    'usrRole': 'Role',
    'tiles': 'Tiles',
}

def function_apply(a):
    for old, new in key_map.items():
        for d in a:
            if old in d:
                d[new] = d.pop(old)
0 голосов
/ 06 апреля 2020

Вам нужна функция, которую можно применить к отдельным диктовкам, например:

keys = [
    ('userid', 'UserId'), ('userType', 'User Type'),
    ('usrRole', 'Role'), ('tiles', 'Tiles'),
]

def rename_keys(dct):
    for old, new in keys:
        if old in dct:
            dct[new] = dct.pop(old)

Эта функция теперь может быть применена к элементам списка в al oop:

for d in a:
    rename_keys(d)

Использование map для этого довольно бессмысленно:

map(rename_keys, a)

само по себе ничего не делает, так как изменения вступят в силу только после использования итератора. Таким образом, вам придется сделать что-то вроде:

list(map(rename_keys, a))
# or
for _ in map(rename_keys, a): pass

Что показывает, почему вы не должны этого делать: один создает ложный список в памяти, другой все равно заканчивается al oop. Если вы не используете возвращаемые значения функции, не используйте ее в map или в понимании.

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