Разбивка, вложенная в циклы в понимании списка Python, которые включают конкатенацию строк - PullRequest
0 голосов
/ 15 октября 2019

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

Вот кодовый блок с пониманием списка:

def letterCasePermutation(S):
    res = ['']
    for ch in S:
        if ch.isalpha():
            res = [i + j for i in res for j in [ch.upper(), ch.lower()]]
    return res

result = letterCasePermutation("ab")
print(result) # expected result = ['AB', 'Ab', 'aB', 'ab']

Чтобы отладить этот кодовый блок, я бы хотел разбить понимание списка на что-то вроде этого:

def letterCasePermutation(S):
    res = ['']
    for ch in S:
        if ch.isalpha():
            # res = [i + j for i in res for j in [ch.upper(), ch.lower()]]

            for i in res:
                for j in [ch.upper(), ch.lower()]:
                    res.append(i + j)
    return res

result = letterCasePermutation("ab")
print(result) 

Приведенный выше блок приводит к ошибке бесконечного цикла вместо предоставления результата, подобного коду блока-1. ожидаемый результат = ['AB', 'Ab', 'aB', 'ab']

Я не могу понять, что мне не хватает. Потратив значительное количество времени и все еще застряв, я решил опубликовать этот вопрос. Заранее спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Понимания не заботятся о присвоении того же имени, которое используется в понимании.

a = [0, 1, 2, 3, 4]
a = [i*2 for i in a]
print(a)

Выходы [0, 2, 4, 6, 8].

На вашем примере вы добавляете элементы в res список при переборе по нему:

for i in a:
    a.append(i)

Это дает вам бесконечный цикл, потому что при переходе к следующему элементу в список добавляется больше элементов.

Вы можете выбрать один из следующих вариантов:присвоение имени новой переменной или использование нарезки для перебора временной копии списка:

a = [0, 1, 2, 3, 4]
b = []
for i in a:
    b.append(i)

print(b)

Выходы [0, 1, 2, 3, 4]

a = [0, 1, 2, 3, 4]
for i in a[:]:
    a.append(i)

print(a)

Вывод [0, 1, 2, 3, 4, 0, 1, 2, 3, 4].

a[:] - это срез a от первого до последнего элемента с шагом 1. Вы можете узнать больше о нарезке здесь или в официальных документах Python.

1 голос
/ 15 октября 2019

Это приводит к бесконечному циклу, потому что вы итерируете по res, for i in res и одновременно добавляете в него новые значения res.append(i + j).

Что не относится к спискупонимание, поскольку выражение справа от = оценивается и присваивается res.

Вы можете использовать второй список, чтобы избежать подобных действий,

def letterCasePermutation(S):
res = ['']
for ch in S:
    if ch.isalpha():
        _res = []
        for i in res:
            for j in [ch.upper(), ch.lower()]:
                _res.append(i + j)
        res = res + _res
return res

result = letterCasePermutation("ab")
print(result) 

Редактировать:

def letterCasePermutation(S):
res = ['']
for ch in S:
    if ch.isalpha():
        _res = []
        for i in res:
            for j in [ch.upper(), ch.lower()]:
                _res.append(i + j)
        res = _res
return res
result = letterCasePermutation("ab")
print(result) 
0 голосов
/ 16 октября 2019

Вот разбивка :) Спасибо вам обоим за то, что помогли мне с идеей.

def letterCasePermutation(S):
    res = ['']
    for ch in S:
        _res = []
        for i in res:
            for j in [ch.upper(), ch.lower()]:
                _res.append(i + j)
        res = _res
    return res


result = letterCasePermutation("ab")
print(result)
...