2017-05-15 13 views
0

私の脳はこれがなぜ機能しないのか理解できません。私は経験が足りず、ループを練習しようとしています。Pythonで文字列を変更する

文字列(現在は1つの単語)を取り、文字をランダムに大文字にする関数を作成しようとしています。

import random 

list = [] 

def hippycase(string): 
    for letter in string: 
     list.append(letter) 

    for index in list: 
     if random.randint(1,2) == 1: 
      list[index] = list[index].upper() 
     else: 
      list[index] = list[index].lower() 
    return list 


print(hippycase("pineapple")) 

任意のアイデアやヒント:リストインデックスは、整数またはスライスではなく、文字列

ここで私が持っているものでなければならないのです。このコードのpythonで例外TypeError?おかげ

EDIT:これは誰かが、次のリンクであると考えて重複としてマークされているので、私は試してみて、違うものを片付けるでしょう:、私は積極的にインデックスを追求しようとしていないよ Accessing the index in Python 'for' loops I偶然、反復可能な索引を順番に通過するループを練習するだけです。私はまた、仲間のnoobコーダーがこれを検索しているともっと役に立つと思います。

+0

「['ループ'のためのPythonのインデックスへのアクセス」(http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) – Cyclonecode

+2

Pythonにはたくさんのツールがありますリスト処理のために。これは 'list(random.choice((str.upper、str.lower))(c)for stringの' c) ' – tdelaney

答えて

1

あなたが使用している変数 "index"は、その文字列を反復処理しているため、文字列の文字です。このエラーを修正するには、インデックスによって、リスト内の各要素にアクセスできるようになります範囲()関数で、使用:

list = [] 

def hippycase(string): 
    for letter in string: 
     list.append(letter) 

    for index in range(len(list)): #here, we are accessing the elements by index 
     if random.randint(1,2) == 1: 
      list[index] = list[index].upper() 
     else: 
      list[index] = list[index].lower() 
    return list 


print(hippycase("pineapple"))  

をもう一つの方法は、単純なリスト内包表記である:

the_string = "pineapple" 

print ''.join([i.upper() if random.randint(1, 2) == 1 else i for i in the_string]) 
+0

あなたの例のようにDownvotedに' hippycase'があります。 。 'hippycase'と呼ばれる2回目(そして3回目)...何が起こるでしょうか? – donkopotamus

+0

範囲機能をグーグルで調べたところ、何が起こっているのか分かりました。私の知識の欠如は、私に動脈瘤を与えるものになります。ご協力いただきありがとうございます! –

+0

もちろん、 "list"には関数から追加されたすべての変数が格納されますが、この問題の文脈でOPが特に関数を1回呼び出すという事実では、コード内で修正されませんでした。 – Ajax1234

2

はここでわずかですあなたのコードのバージョンこのバージョンでは、我々は唯一のあなたの文字列の文字を見ていることを

def hippycase(string): 
    charlist = [] 
    for char in string: 
     if random.randint(1,2) == 1: 
      charlist.append(char.upper()) 
     else: 
      charlist.append(char.lower()) 
    return charlist 

お知らせ改善し、我々はインデックスを気にしない - これは混乱を減らすのに役立ちます。また

私は実際に「hippycase」に呼び出し元の関数は、(彼らはおそらく期待するものである)文字列を取り戻すだろうので、私はおそらく、「」.join(CHARLISTを)返す文字列を、これを書いていた場合

list予約語を上書きすることは悪い習慣です。

+0

ありがとう!天才のためアップアップ。 –

関連する問題