Есть ли лучший способ сделать «сложное» понимание списка? - PullRequest
0 голосов
/ 05 мая 2018

Я часто использую списочное понимание в Python, потому что я думаю, что это чистый способ генерировать списки, но часто я возвращаюсь через неделю и думаю про себя "Какого черта я это сделал? for?! " и это более 70 символов вложенного условного оператора. Мне интересно, дойдет ли до определенного момента, если мне следует разбить его на if / elif / else, и влияние на производительность, если таковое будет.

Мои текущие обстоятельства:

Возвращенная структура из вызова представляет собой список кортежей. Мне нужно привести его к списку, некоторые значения необходимо очистить, и мне нужно удалить последний элемент из списка.

, например

[(val1, ' ', 'ChangeMe', 'RemoveMe),
 (val1, ' ', 'ChangeMe', 'RemoveMe),
 (val1, ' ', 'ChangeMe', 'RemoveMe)]

Так что в этом случае я хочу удалить RemoveMe, заменить все ' ' на '' и заменить ChangeMe на val2. Я знаю, что это много изменений, но данные, которые мне возвращают, иногда ужасны, и я не могу контролировать то, что мне приходит в ответ.

У меня сейчас что-то вроде:

response = cursor.fetchall()
response = [['' if item == ' ' else item if item != 'ChangeMe' else 'val2' for item in row][:-1] for row in response]`

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

Любые советы или информация будет принята с благодарностью. Спасибо всем!

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Python поддерживает однострочность, при условии, что они делают код более читабельным , а не усложняют его.

В этом случае вы используете два понимания вложенных списков, два смежных троичных оператора, разрезание списка, и все это в одной строке, которая превышает 100 символов ... Это все, кроме читабельности.

Иногда лучше использовать классический цикл.

result = []
for val, space, item, remove in response:
    result.append([val, '', 'val2'])

И тогда вы понимаете, что вы можете написать его как список более понятный (при условии, что ваше условие фильтрации простое):

result = [[val, '', 'val2'] for val, *_ in response]

Помните, каждый код написан один раз , но он прочитан много раз .

0 голосов
/ 05 мая 2018

Это один из быстрых способов сделать списки, используя словарь для отображения элементов:

response = [('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', 'RemoveMe')]
map_dict = {' ': '', 'ChangeMe': 'val2', 'val1': 'val1'}

response = [tuple(map_dict[x] for x in tupl if x != 'RemoveMe') for tupl in response]
# [('val1', '', 'val2'), ('val1', '', 'val2'), ('val1', '', 'val2')]                                                   
...