7

I don't know what I'm doing wrong, but the function .lower() in my python code is not working!

It's a sily code, but it does not lower de cases of the word:

score = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2, 
         "f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3, 
         "l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1, 
         "r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4, 
         "x": 8, "z": 10}

def scrabble_score(word):
    word.lower()
    print word
    total =0
    for i in word:
        total += score[i]
    return total

print scrabble_score('Helix')    

some help?

Victor Zuanazzi
  • 1,838
  • 1
  • 13
  • 29
  • 5
    try `word = word.lower()` – Vader Feb 27 '15 at 11:56
  • 1
    It should be `word = word.lower()` – kundan Feb 27 '15 at 11:56
  • 3
    `word = word.lower()` as strings are immutable. – Tanveer Alam Feb 27 '15 at 11:56
  • It should've been obvious the error seeing as you printed word after you call `word.lower()` – EdChum Feb 27 '15 at 11:58
  • You have a lot of answers here, but none really explains why this happens. It's because python strings are immutable. That means you can't change them in-place, just make a changed copy of it and assign it to some other variable, or itself. Python has mutable variables, i.e. lists. – ljetibo Feb 27 '15 at 11:58

3 Answers3

11

You have to assign the result of lower() back to word as strings are immutable:

In [152]:

score = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2, 
         "f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3, 
         "l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1, 
         "r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4, 
         "x": 8, "z": 10}

def scrabble_score(word):
    word = word.lower() #<------ here assign back
    print(word)
    total =0
    for i in word:
        total += score[i]
    return total

print(scrabble_score('Helix'))

helix
15

See related: Why are Python strings immutable? Best practices for using them

Community
  • 1
  • 1
EdChum
  • 376,765
  • 198
  • 813
  • 562
2

Do:

word = word.lower()

because lower() doesn't modify original string

Andrey
  • 59,039
  • 12
  • 119
  • 163
1

This is because you are not assigning value to word after converting it into lowercase. So it still has the old value which is "Helix"

word = word.lower()
planet260
  • 1,384
  • 1
  • 14
  • 30