2016-10-30 25 views
2

誰かが私を助けてくれることを願っています。私はこの一日中一緒に行ってきました。私はユーザーに"800-FLOWERS"のようなテキストを含む電話番号を入力させようとしています。私はただの数字として出力を印刷したいが、私は次のエラーが表示されます。ここstr()変換が機能しない

TypeError: Can't convert 'int' object to str implicitly 

は私のコードです:

keypad = {'a':2, 'A':2, 'b':2, 'B':2, 'c':2, 'C':2, 
      'd':3, 'D':3, 'e':3, 'E':3, 'f':3, 'F':3, 
      'g':4, 'G':4, 'h':4, 'H':4, 'i':4, 'I':4, 
      'j':5, 'J':5, 'k':5, 'K':5, 'l':5, 'L':5, 
      'm':6, 'M':6, 'n':6, 'N':6, 'o':6, 'O':6, 
      'p':7, 'P':7, 'q':7, 'Q':7, 'r':7, 'R':7, 's':7, 'S':7, 
      't':8, 'T':8, 'u':8, 'U':8, 'v':8, 'V':8, 
      'w':9, 'W':9, 'x':9, 'X':9, 'y':9, 'Y':9, 'z':9, 'Z':9} # Create keypad dict 
phone_num = input('Enter a phone number: ') 

for key, value in keypad.items(): 
    phone_num = (phone_num.upper().replace(key, value)) 
    phone_num = str(phone_num) 
    print('The number entered is: %s'% phone_num) 
+0

を文字列を取得するraw_inputを行う必要があります。 –

+0

問題を解決するのに役立つ解決策を受け入れることを検討する必要があります。これは他の読者にも問題の解決に実際に役立ったことを示しているからです。 – idjaw

答えて

0

あなたの2行は後方いるように見えます!最初に数字を文字列に変換してから、各文字を置き換えることができます。あなたはそれをやっているようです、そして、それがエラーを起こす理由です。

#Switch from this 
phone_num = (phone_num.upper().replace(key, value)) 
phone_num = str(phone_num) 

#To this 
phone_num = str(phone_num) 
phone_num = (phone_num.upper().replace(key, value)) 

#Or even shorter, this 
phone_num = str(phone_num.upper().replace(key, value)) 
5

あなたは許可されていないintタイプ、とstringを連結しようとしています。あなたはこのラインでそれをやっている:

phone_num = (phone_num.upper().replace(key, value)) 

は最終的に、あなたが交換するとやっていることstringにしてintタイプを入れしようとしています。これを解決するには、上strをキャストvalue:あなたはこれを削除することができますので、後にラインを持っているあなたを必要としない

phone_num = (phone_num.upper().replace(key, str(value))) 

は:phone_num = str(phone_num)

これを見て、正確なエラーをデモするために:

>>> s = "abc" 
>>> s = s.replace('a', 4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't convert 'int' object to str implicitly 

さらに、あなたのループの外で、あなたの最後のprintを置くか、それはすべての反復で印刷されます。あなたのエラーを修正する際

は、コードは次のような実行されます。

Enter a phone number: 800-FLOWERS 
The number entered is: 800-3569377 


for key, value in keypad.items(): 
    phone_num = (phone_num.upper().replace(key, str(value))) 
print('The number entered is: %s'% phone_num) 

強化ソリューション

あなたが考えることができ

にこのわずかに異なる方法でやって。 keypad辞書を反復する代わりに、代わりに文字列を繰り返して、アルファベット文字があるかどうかを確認してください。そうであれば、辞書を検索して値を取得し、文字列にキャストします。それ以外の場合は、新しい文字列に「文字」を追加します。あなたは、両方の組み合わせを持っている場合は、上部の必要はありません

keypad = { 
    'A': 2, 'B': 2, 'C': 2, 
    'D': 3, 'E': 3, 'F': 3, 
    'G': 4, 'H': 4, 'I': 4, 
    'J': 5, 'K': 5, 'L': 5, 
    'M': 6, 'N': 6, 'O': 6, 
    'P': 7, 'Q': 7, 'R': 7, 
    'S': 7, 'T': 8, 'U': 8, 
    'V': 8, 'W': 9, 'X': 9, 
    'Y': 9, 'Z': 9 
} 
phone_num = input('Enter a phone number: ') 

phone_as_digits = "" 
for char in phone_num: 
    phone_as_digits += str(keypad[char.upper()]) if char.isalpha() else char 
print(phone_as_digits) 
0

、および:また、これはあなたがすでにupperにキャストされているので、あなたの辞書には、唯一のケーシングに簡略化することができ、同様にあなたの元の溶液に適用されますあなたが値を持つキーを交換する前に、上にphone_numを変換しているので、あなたがキーパッド辞書に大文字とsmallcaseの両方を持っている必要はありませんpython2

keypad = {'a':2, 'A':2, 'b':2, 'B':2, 'c':2, 'C':2, 
      'd':3, 'D':3, 'e':3, 'E':3, 'f':3, 'F':3, 
      'g':4, 'G':4, 'h':4, 'H':4, 'i':4, 'I':4, 
      'j':5, 'J':5, 'k':5, 'K':5, 'l':5, 'L':5, 
      'm':6, 'M':6, 'n':6, 'N':6, 'o':6, 'O':6, 
      'p':7, 'P':7, 'q':7, 'Q':7, 'r':7, 'R':7, 's':7, 'S':7, 
      't':8, 'T':8, 'u':8, 'U':8, 'v':8, 'V':8, 
      'w':9, 'W':9, 'x':9, 'X':9, 'y':9, 'Y':9, 'z':9, 'Z':9} # Create keypad dict 
phone_num = raw_input('Enter a phone number: ') 

for key, value in keypad.items(): 
    phone_num = phone_num.replace(key,str(value)) 
print('The number entered is: %s' % phone_num) 
関連する問題