Предположим, мы должны вставить два элемента в понимание списка за одну итерацию, но нам нужно выбрать, какие два вставить.Как нам составить такой список понимания.
Например: - Предположим, у нас есть список hostnames = ['aa', 'bb', 'dd', 'pp', 'bb', 'zz', 'hh']
.
Теперь мы хотим изменить этот список таким образом, чтобы имена хостов, начинающиеся с p, имели дополнительный элемент, называемый _prd (например,'pp_prd') и аналогичным образом дополнительный элемент для имен хостов, начинающийся с h со значением "_uat" (например, "hh_uat").
Таким образом, желаемый вывод для приведенного выше списка будет mod_hostnames = ['aa', 'bb', 'dd', 'pp_prd', 'pp', 'bb', 'zz', 'hh_uat','hh']
.
Теперь я подумал написать так:
>>> fh=lambda x: x+'_uat'
>>> fp=lambda x:x+'_prd'
>>> fo=lambda x:x
>>> lis
['aa', 'bb', 'dd', 'pp', 'bb', 'zz', 'hh']
>>> hostnames = lis
>>> mod_hostnames = [f(host) for f in (fo,fp) if host[0]=='p' else f(host) for f in (fo,fh) if host[0]=='h' else host for host in hostnames]
File "<stdin>", line 1
mod_hostnames = [f(host) for f in (fo,fp) if host[0]=='p' else f(host) for f in (fo,fh) if host[0]=='h' else host for host in hostnames]
^
SyntaxError: invalid syntax
Мы получаем синтаксическую ошибку,Я также знаю, что в списочном понимании второй цикл выполняется быстрее (как в циклах for), и в нашем коде host in hostnames
работает быстрее, чем другой требуемый способ.Итак, я попробовал это: -
>>> mod_hostnames = [f(host) for host in hostnames for f in (fo,fp) if host[0]=='p' else for f in (fo,fh) if host[0]=='h' else for f in (fo)]
File "<stdin>", line 1
mod_hostnames = [f(host) for host in hostnames for f in (fo,fp) if host[0]=='p' else for f in (fo,fh) if host[0]=='h' else for f in (fo)]
^
SyntaxError: invalid syntax
Есть предложения?Или это невозможно в списках.Я знаю, что это вообще не читается, и есть гораздо лучшие способы записать это.(например, используя dict 'switch', чтобы записать это в одном операторе внутри цикла for, или старый добрый if в цикле и т. д.).
Редактирование пост-решения: Получены прекрасные ответы.Спасибо!Может кто-нибудь объяснить, почему код, который я разместил, также неверен?Я чувствую это потому, что операторы, вычисленные, когда условие истинно или ложно, просто преобразуются в пустой цикл for: for f in (fo,fp) if host[0]=='p' else for f in (fo,fh)
если host [0] == 'p', программа переходит в пустой цикл for for f in (fo,fp)
.Это правильно?Думаю, обратное проектирование моего неверного понимания в цикл for прояснит это.