Как решить строковые индексы должны быть целыми числами в a для l oop для использования заглавных букв в каждом слове в строке - PullRequest
0 голосов
/ 17 июня 2020

Надеюсь, все в безопасности.

Я пытаюсь ввести go над строкой и сделать каждую первую букву строки заглавной. Я знаю, что могу использовать .title (), но

а) Я хочу выяснить, как использовать в этом случае заглавные буквы или что-то еще - основы и

б) Строки в тестах , добавьте несколько слов с ('), что сбивает .title () с толку, и используйте заглавную букву после (').

def to_jaden_case(string):
    appended_string = ''
    word = len(string.split())
    for word in string:
       new_word = string[word].capitalize()
       appended_string +=str(new_word)
    return appended_string

Проблема в том, что интерпретатор выдает мне «TypeError: строковые индексы должны быть целыми числами» даже если у меня есть целочисленный ввод в "слово". Любая помощь?

спасибо!

Ответы [ 6 ]

1 голос
/ 17 июня 2020

Вы делаете в коде какие-то странные вещи.

Сначала вы разбиваете строку только для подсчета количества слов, но не сохраняете ее для обработки слов после этого.

Во-вторых, при итерации строки с помощью for in вы получаете символы строки, а не слова.

Я сделал небольшой фрагмент, чтобы помочь вам делать то, что вы хотите :

def first_letter_of_word_upper(string, exclusions=["a", "the"]):
    words = string.split()
    for i, w in enumerate(words):
        if w not in exclusions:
            words[i] = w[0].upper() + w[1:]
    return " ".join(words)

test = first_letter_of_word_upper("miguel angelo santos bicudo")
test2 = first_letter_of_word_upper("doing a bunch of things", ["a", "of"])

print(test)
print(test2)

Примечания:

  • Я присвоил значение разбиения строки переменной, чтобы использовать его в l oop
  • В качестве бонуса , Я включил список, позволяющий исключить слова, которые вы не хотите использовать с заглавной буквы.
  • Я использую исходный тот же массив разделенных слов для построения результата ... а затем присоединяюсь на основе этого массива. Это способ сделать это эффективно.
  • Кроме того, я показываю несколько полезных Python трюков ... сначала enumerate (итерация), которая возвращает кортежи (i, j), где i - позиционный индекс, а j значение в этой позиции. Во-вторых, я использую w[1:], чтобы получить подстроку текущего слова, которая начинается с индекса символа 1 и идет до конца строки. Ах, а также использование необязательных параметров в списке аргументов функции ... действительно полезные вещи для изучения! Если вы их еще не знали. =)
1 голос
/ 17 июня 2020

In for word in string: word будет перебирать символы в string. Вы хотите сделать что-то вроде этого:

def to_jaden_case(string):
    appended_string = ''
    splitted_string = string.split()
    for word in splitted_string:
        new_word = word.capitalize()
        appended_string += new_word
    return appended_string

Результат для to_jaden_case("abc def ghi") теперь "AbcDefGhi", это CammelCase . Я полагаю, вы действительно хотите это: "Abc Def Ghi". Для этого вы должны сделать:

def to_jaden_case(string):
    appended_string = ''
    splitted_string = string.split()
    for word in splitted_string:
        new_word = word.capitalize()
        appended_string += new_word + " "
    return appended_string[:-1]  # removes the last space. 
1 голос
/ 17 июня 2020

У вас есть логическая ошибка в вашем коде: вы использовали слово = len (string.split ()), которое бесполезно, также есть проблема в for l oop logi c.

Попробуйте следующее:

def to_jaden_case(string):
    appended_string = ''
    word_list = string.split()
    for i in range(len(word_list)):
        new_word = word_list[i].capitalize()
        appended_string += str(new_word) + " "
    return appended_string
1 голос
/ 17 июня 2020

Посмотрите, в вашем коде word - это символ строки, это не индекс, поэтому вы не можете использовать строку [word], вы можете исправить эту проблему, изменив свой l oop или используя word вместо string [word]

Итак, ваш исправленный код будет:

def to_jaden_case(string):
    appended_string = ''
    for word in range(len(string)): 
        new_word = string[word].capitalize()
        appended_string +=str(new_word)
    return appended_string

Здесь я изменил третью строку для слова в строке с для слова в len (строка) , аналог дает вам индекс каждого символа, и вы можете их использовать! Также я удалил строку split , потому что она не нужна, и вы можете сделать это для l oop, например, len (string)

1 голос
/ 17 июня 2020

Вы используете строковый индекс для доступа к другой строке word - это строка, к которой вы обращаетесь word с использованием string[word], что вызывает ошибку.

def to_jaden_case(string):
   appended_string = ''
   for word in string.split():
       new_word = word.capitalize()
       appended_string += new_word
   return appended_string

Простое решение с использованием map()

def to_jaden_case(string):
    return ' '.join(map(str.capitalize, string.split()))
1 голос
/ 17 июня 2020
from re import findall

def capitalize_words(string):
    words = findall(r'\w+[\']*\w+', string)
    for word in words:
        string = string.replace(word, word.capitalize())
    return string

Это просто захватывает все слова в строке, затем заменяет слова в исходной строке, символы внутри [] также будут включены в слово

...