Могу ли я сделать понимание списка, который добавляет значение после цикла for - PullRequest
0 голосов
/ 08 октября 2018
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)

print(subs)

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

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Поскольку вы используете свой флаг passable просто для проверки, находится ли i в текущей подстроке, вы можете использовать следующее понимание списка с условием, которое делает это, используя оператор in:

[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']

0 голосов
/ 08 октября 2018

Поскольку вы хотите сохранить самый внутренний цикл, вы можете сделать что-то вроде этого:

subs = [ s[g:o+1] for g in range(len(s)) for o in range(g,len(s)) if all( [s[g:o+1][v]!="i" for v in range(len(s[g:o+1]))] ) ]
0 голосов
/ 08 октября 2018

Список пониманий: все о добавлении к списку в цикле 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])
]
...