Python Python Collections (2016, retired 2019) Slices sillyCase

Artur Owczarek
Artur Owczarek
2,995 Points

Beginning Python - sillycase

I got this error: Traceback (most recent call last): " File "C:/Users/Artur/Desktop/Python/Sillycase/sillycase.py", line 12, in <module> print(sillycase("Treehouse")) File "C:/Users/Artur/Desktop/Python/Sillycase/sillycase.py", line 4, in sillycase word_copy[index] = word_copy.lower() AttributeError: 'list' object has no attribute 'lower' "

But I don't understand. In my opinion word_copy[index] isn't a list but a string.

sillycase.py
def sillycase(word):
    word_copy = list(word)
    for index in range(len(word) // 2):
        word_copy[index] = word_copy.lower()
    for index in range(len(word) // 2 + 1, len(word) - 1):
        word_copy[index] = word_copy.upper()
    word = ""
    for letter in word_copy:
        word += letter
    return word

Really cool to see how you built this! How does python know what you mean by "letter" since it is not defined anywhere in the function?

3 Answers

Steven Parker
Steven Parker
171,226 Points

But "word_copy" is indeed a list. It is created by converting "word" into a list on the very first line:

    word_copy = list(word)

But you don't need to convert it, since slices work on strings just as well as they do on lists. And the whole purpose of this exercise is to practice using slices. Try rethinking your approach to make use of them, which will also save you from needing any loops.

Artur Owczarek
Artur Owczarek
2,995 Points

Thank you very much for a help!

I wrote the code in that way and it works. :D

sillycase.py
def sillycase(word):
    lower = word.lower()
    upper = word.upper()
    return lower[:len(word) // 2] + upper[len(word) // 2:]

Anyway, I don't understand why in the previous code word_copy[index] is a list. It's weird. Components of word_copy are one character strings so why word_copy[index] is a list? :)

Steven Parker
Steven Parker
171,226 Points

You're right, word_copy[index] is not a list, since it's just one item. But where the code has: "word_copy.lower()", the "lower" method is being applied directly to "word_copy" itself, which is a list. And that causes the error.

Happy coding!

Artur Owczarek
Artur Owczarek
2,995 Points

Ahhh I got it. Thanks very much again. :)

Junaid Abbasi
Junaid Abbasi
3,251 Points

this is so easy to understand!!

Neil Brown
Neil Brown
22,508 Points

word_copy[index] is a string. word_copy is a list (of string characters). The error comes from you applying lower() to word_copy, which is a list.