Python использует заглавные буквы списков строк - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь использовать каждую строку в списке на Python 3. Я использую этот код

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s,list):
            capitalize_nested(s)
        res.append(s.capitalize())
    return res

Код работает для списка строк, но не для списка списков строк,например, когда я запускаю его для t = ["asd", ["asd"]], я ожидаю ["Asd", ["Asd"]] в качестве вывода, вместо этого я получаю следующую ошибку:

Traceback (most recent call last):                                                                                             
  File "/home/main.py", line 10, in <module>                                                                                   
    print(capitalize_nested(t))                                                                                                
  File "/home/main.py", line 6, in capitalize_nested                                                                           
    res.append(s.capitalize())                                                                                                 
AttributeError: 'list' object has no attribute 'capitalize'

Я не понимаю, что означает ошибка.Почему код обрабатывает элементы подсписка в рекурсии как списки, а не строки?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Если в вашем коде тип s является списком, то после выполнения внутренней части условия if компилятор также вызовет метод capitalize (который не определен для списка s).Так что вам нужна другая оценка.Также вы должны добавить результат повторения:

def capitalize_nested(t):
    res=[]
    for s in t:
        if type(s) == list:
            res.append(capitalize_nested(s))
        else:
            res.append(s.capitalize())
    return res


print capitalize_nested(['asd', ['asd',]])

Это должно вывести:

['Asd', ['Asd']]
0 голосов
/ 27 февраля 2019

Ошибка уже говорит вам о проблеме: вы пытаетесь вызвать capitalize в списке, что невозможно.

Причина этого: если s является списком, вырекурсивно вызываем вашу функцию, и это нормально.Но после возврата рекурсивного вызова вы вызываете res.append(s.capitalize()), что выдает ошибку, поскольку s является списком и, следовательно, нет функции capitalize().

Лучше сделать что-то вроде этого:

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s, list):
            to_append = capitalize_nested(s)
        else:
            to_append = s.capitalize()
        res.append(to_append)
    return res

Пример:

Ввод: ["asd",["asd"]]

Выходы: ['Asd', ['Asd']]

Примечание: Конечно, это не самый элегантный илипрекрасное решение, но я не хотел слишком сильно менять ваш код, и, надеюсь, это объясняет проблему.

0 голосов
/ 27 февраля 2019

Проблема в том, что вы напрямую звоните capitalize_nested вместо добавления capitalize_nested в одну ветку вашего кода.Попробуйте это:

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s,list):
            res.append(capitalize_nested(s))
        else:
            res.append(s.capitalize())
    return res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...