2017-08-03 15 views
-1

私は比較的新しいpythonで、現在オンラインで見つかった学校プロジェクトに取り組んでいます。このコードを実行すると、配列に "Action"と "Sport"が何回表示されるのかをカウントする必要があります。私は、これは出力があるべき考慮起こっている理由を私は理解してどのようにかしていない9として、このコードActionCounterが0として印刷され、SportCounterが印刷されたを実行するとアレイ検索が機能しません - 理由がわかりません。

forename = ["Joe", "George", "Oliver"] 
HistoryGenre=[["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], ["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], ["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]] 
rr=1 
ActionCounter=0 
SportCounter=0 
while rr==1: 
    rec=input("Who would you like to recommend games for?") 
    if rec in forename: 
     rr+=1 
     r=forename.index(rec) 
     RepeatIndex=0 
     for i in HistoryGenre[r]: 
      if HistoryGenre[r:RepeatIndex]=="Action": 
      ActionCounter+=1 
      RepeatIndex+=1 
      else: 
       SportCounter+=1 
       RepeatIndex+=1 
      if RepeatIndex==9: 
       print(ActionCounter) 
       print(SportCounter) 

7と3。それは、おそらく以上のものです初心者の間違い。

答えて

1

あなたのコードが持っている問題は

if HistoryGenre[r:RepeatIndex]=="Action": 
は、HistoryGenre [R]のn番目の項目を参照し

HistoryGenre[r][n] 

行うためにここにある。しかし、あなたがHistoryGenre [R]以上のforループであり、あなただけができるようにする

for i in HistoryGenre[r]: 
    if i == "Action": 
     ... 

あなたが与えたプロジェクトがカウント機能を果たしていないかどうかわかりませんが、あなたの人生はずっと簡単です。代わりにActionCounterとSportCounter変数に加えることで、あなたはこのような各リストで数を見つけることができます:

ActionCounter = HistoryGenre[r][:9].count("Action") 

[:9]あなたが望むように見えるすべてで、リスト内の最初の9つの要素を取ります。また、2つの並行リストの代わりに辞書を使用することもできます。ディクショナリでは、要素にはキーがあるため、特定の要素を参照するにはキーを使用します。例

namebook = {"Joe":["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], "George":["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], "Oliver":["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]} 

Joeの本のジャンルを取得するためには、単にそれらの変更を使用して

namebook["Joe"] 

を使用し、あなたのプログラムがたくさん短くすることができます。

namebook = {"Joe":["Action", "Action", "Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport"], "George":["Sport", "Sport", "Sport", "Sport", "Action", "Action", "Sport", "Sport", "Sport", "Action"], "Oliver":["Action", "Action", "Sport", "Sport", "Action", "Action", "Action", "Sport", "Sport", "Sport"]} 
inputname = input() 
print(namebook[inputname][:9].count("Action")) 
print(namebook[inputname][:9].count("Sport")) 
+0

うわーの値に加算され、今の鍵であるので、これは私の問題を修正しましたので、ありがとうございました。私は配列を検索するための適切な構文を知らなかったようです。しかし、私はまだActionCounterの出力が0であった理由とSportCounterが9であった理由についてはまだ分かりません。また、一度も使ったことのない辞書について教えてくれてありがとう。 –

+0

@OliD HistoryGenre [r:RepeatIndex] ==「アクション」は決して真ではないので、常にスキップしてelse:SportsCounter + = 1に移動します。 –

0

これは、あなたの質問に答えていませんが、それはすでにここに回答されているので、私はあなたがこれを実装する場合、各サブリストで発生回"Sports""Action"の数をカウントするために思い付いたものです。

for subList in HistoryGenre: 

    string = "" 

    string += ' '.join(subList) + " " 

    words = {} 

    for word in string.split(): 
     try: 
      words[word] += 1 
     except KeyError: 
      words[word] = 1 

    print(words) 


Out: 
    {'Sport': 3, 'Action': 7} 
    {'Sport': 7, 'Action': 3} 
    {'Sport': 5, 'Action': 5} 

word存在しない最初のwords[word]でキー

です。だから私が試すときwords[word] += 1 wordキーが存在しないので、プログラムはKeyErrorになります。

プログラムは、私は、キーwordが値1に設定されているKeyErrorブロック内KeyError

exceptクラッシュしないように。そう

wordは言葉がstring.split()1に遭遇するたびにword

+0

これは本当に私の理解を深めてくれたことに感謝しました。しかし、「KeyError:lineは何をするのですか?私は明らかに多くのPythonにはあまりよく慣れていません。 –

+0

@OliD私の回答を更新しました –

関連する問題