Как мне сделать определенные элементы списка строчными, используя str.lower(), если они отображаются в другом списке?

#python #list #filter #lowercase

#python #Список #Фильтр #нижний регистр

Вопрос:

Я пытался решить проблему в CodeWars и столкнулся с препятствием. Я знаю, что это не особенно «питонический» подход (я новичок). И я уверен, что есть более эффективные и продвинутые способы сделать это. Но я действительно просто пытаюсь понять, почему приведенный ниже код не работает. Я просто хочу сделать строковые элементы списка строчными, если они отображаются в другом списке слов фильтра. (Игнорируйте код для удаления первого элемента. Это потому, что задача требует другой обработки первого элемента).

 def title_case(title, minors=''):
    title = title.title()
    mwds = minors.split()
    lst = title.split(" ", 1)

    exfirst = lst[1].split()
    for wd in exfirst:
        wd.lower()
        if wd in mwds:
            wd.lower()
    return exfirst

print(title_case('a clash of KINGS', 'a an the of'))
print(title_case('THE WIND IN THE WILLOWS', 'The In'))
  

Результат:

 ['Clash', 'Of', 'Kings']
['Wind', 'In', 'The', 'Willows']
  

Ожидаемый результат:

 ['Clash', 'of', 'Kings']
['Wind', 'in', 'the', 'Willows']
  

Комментарии:

1. Ваш код неверно отформатирован, пожалуйста, исправьте отступ. str.lower() возвращает копию строки в нижнем регистре, она не изменяет исходную. Строки неизменяемы.

Ответ №1:

Это потому, что вы не назначаете новый младший для старого младшего. Чтобы назначить, вы должны использовать index в качестве итератора в exfirst списке.

 for i in range(exfirst):
    wd= exfirst[i].lower()
    if wd in mwds:
        exfirst[i] = wd
  

Ответ №2:

Метод lower() не изменяет символы на месте. Вы должны сделать:

 wd = wd.lower()