Список пониманий: все о добавлении к списку в цикле for (создание списка в начале, возвращение этого списка в результате), но сначала вам нужно немного преобразовать логику.
Понимание списка в основном представляет собой серию вложенных циклов и if
фильтров, а также одно выражение, которое определяет значения для добавления:
for ... in ...:
if ...:
for ... in ...:
expression_generating_value_to_append
с минимумом одного цикла с нулемили более if
фильтров и дополнительных петель.Если вы можете преобразовать свой код в такую структуру, вы можете сделать его понятным для списка.
Ваш код еще не совсем готов, потому что у вас есть
substring = s[g:o+1]
passable = True
for char in substring:
if char == "i":
passable = False
if passable:
subs.append(substring)
, но это легкобыть преобразован в простой in
тест сдерживания:
if "i" not in s[g:o + 1]:
subs.append(s[g:o + 1])
Это в основном то же самое;если символ "i"
отсутствует в подстроке, то подстрока является проходимой и может быть добавлена:
Так что теперь у вас есть
subs = []
for g in range(len(s)):
for o in range(g, len(s)):
if "i" not in s[g:o+1]:
subs.append(s[g:o+1])
, которую можно преобразовать в понимание списка;используйте те же циклы и тесты if
, но переместите деталь в subs.append()
вперед;это та часть, которая производит каждое значение в списке вывода:
subs = [
s[g:o+1]
for g in range(len(s))
for o in range(g, len(s))
if "i" not in s[g:o+1]
]
или в одну строку:
subs = [s[g:o+1] for g in range(len(s)) for o in range(g, len(s)) if "i" not in s[g:o+1]]
, и это действительно дает тот же вывод, что и ваш цикл:
>>> s = "lallalaiial"
>>> subs = []
>>> for g in range(len(s)):
... for o in range(g, len(s)):
... substring = s[g:o+1]
... passable = True
... for v in range(len(substring)):
... if(substring[v] == "i"):
... passable = False
... if(passable):
... subs.append(substring)
...
>>> subs
['l', 'la', 'lal', 'lall', 'lalla', 'lallal', 'lallala', 'a', 'al', 'all', 'alla', 'allal', 'allala', 'l', 'll', 'lla', 'llal', 'llala', 'l', 'la', 'lal', 'lala', 'a', 'al', 'ala', 'l', 'la', 'a', 'a', 'al', 'l']
>>> [s[g:o+1] for g in range(len(s)) for o in range(g, len(s)) if "i" not in s[g:o+1]]
['l', 'la', 'lal', 'lall', 'lalla', 'lallal', 'lallala', 'a', 'al', 'all', 'alla', 'allal', 'allala', 'l', 'll', 'lla', 'llal', 'llala', 'l', 'la', 'lal', 'lala', 'a', 'al', 'ala', 'l', 'la', 'a', 'a', 'al', 'l']
Если вы должны использовать цикл for
для проверки отсутствия "i"
, то вы все равно можете использовать цикл с выражением генератора и all()
или any()
функций.По сути, они делают то же самое, что ваш цикл, устанавливающий логическое значение в цикле, когда вы сталкиваетесь с доказательством того, что тест не выполняется для всех элементов в последовательности, за исключением того, что цикл обрезается в этой точке (как если бы вы использовали break
вif char == "i":
block:
if not any(char == "i" for char in s[g:o+1]):
subs.append(s[g:o+1])
Это медленная "i" not in s[g:o+1]
реализация с использованием цикла, и полное понимание списка тогда становится
subs = [
s[g:o+1]
for g in range(len(s))
for o in range(g, len(s))
if not any(char == "i" for char in s[g:o+1])
]