Вложенные циклы не проблема для списковых, как вы можете вложить те там тоже:
lst = []
for y in z:
for x in y:
lst.append(f(x))
Это выражается в следующем списке понимание:
[f(x) for y in z for x in y]
И вы можете легко продолжить это для нескольких уровней.
условия, которые принимают решение о хотите ли вы что-то добавить в список или нет, также работают просто отлично:
lst = []
for x in y:
if t(x):
lst.append(f(x))
Это переводится в следующий список понимания с фильтром:
[f(x) for x in y if t(x)]
Из Конечно, вы также можете комбинировать это с несколькими уровнями.
что теперь является какой-то проблемы, хотя, когда вы хотите, чтобы выполнить что-то первый, а затем отфильтровать результат, что и добавить также то, что зависит от результата. Наивный решением было бы переместить вызов функции внутри и сделать это дважды:
rexpr = re.compile('some pattern to match')
[rexpr.search(y).group(1) for x in something for y in x.address if rexpr.search(y)]
Но это, очевидно, работает поиск в два раза, которые вы обычно хотите избежать. На данный момент вы можете использовать некоторые хакерские решения, которые я обычно не рекомендую (поскольку они ухудшают читаемость). Поскольку ваш результат зависит только от результата поиска регулярных выражений, вы также можете решить это в два этапа: во-первых, вы выполняете поиск по каждому элементу и сопоставляете их с объектом-совпадением, а затем фильтруете по этим совпадениям и просто возвращаете действительный из них:
[m.group(1) for m in (rexpr.search(y) for x in something for y in x.address) if m]
Обратите внимание, что я использую выражение генератора здесь: это в основном так же, как списковые, но не создают полный результата в виде списка, но выход только на элементе в то время. Таким образом, это более эффективно, если вы только хотите потреблять это по одному (что и есть здесь). В конце концов, вас интересует только результат из понимания списка, поэтому понимание будет потреблять выражение генератора.
Итак, где понимается список? И как это не работает? в чем проблема? – Kasramvd
является 'if', который должен находиться внутри блока' for' или нет? – Kevin
Предполагается, что он находится внутри блока. Извините за опечатку. – hmmm