2017-11-21 5 views
0

リストに残っているアイテムの数に基づいて、リスト内の特定のポイントに番号を割り当てる方法を理解しようとしていました。
例えば:リストのリストの長さに基づいてポイントを割り当てる

def prizeHandout(prizeWinners): 
    for x in range(len(prizeWinners)): 
     if len(prizeWinners) == 24: 
      prizeWinners[x][2] = (int(prize[0])) 
     elif len(prizeWinners) == 12: 
      prizeWinners[x][2] = (int(prize[1])) 
     elif len(prizeWinners) == 6: 
      prizeWinners[x][2] = (int(prize[2])) 
    print(prizeWinners) 

I 'は、prizeWinnersが「prizeWinners」はこの形式[[ab, 2, 0], [ba, 5, 0], [aa, 12, 0], .....]
にリストのリストにある賞とのリストであるグローバル変数'prize' [10, 20, 30,....]
を有します変数 'prize'の割り当ては、現在のスペース[2]に追加し、前の番号に追加する必要があります。
これは機能していないようです。任意の助けをいただければ幸い
、感謝:)

def prizesFunction(): 
    with open('prizes.csv', 'r') as f: 
     reader = csv.reader(f) 
     prizePoints = list(reader) 
     first= [i[1] for i in prizePoints] 
     second = [i[0] for i in prizePoints] 
     third = [i[2] for i in prizePoints] 
     fourth = [i[3] for i in prizePoints] 

    choice = input('Enter your choice [0-4] : ') 
    choice = int(choice) 
    global prize 
    if choice == 1: 
     prize = first 
     return prize 
    elif choice == 2: 
     prize =second 
     return prize 
    elif choice == 3: 
     prize = third 
     return prize 
    elif choice == 4: 
     prize = fourth 
     return prize 
+0

何を試しましたか?何が起こり、あなたは何を期待しますか? – mrCarnivore

+0

こんにちはmrCarnivore、私は[[ab、2、10]、[ba、5、10]、.....]の最初の出力を期待しています現在、 'TypeError:'エラーが発生していますstr 'オブジェクトは項目の割り当てをサポートしていません'と変数の型を変更しようとしましたが、リストであるので、何を試して変更するのか不明です。 – abercrombiefan1

+0

問題につながる正確なコード(関連する部分のみ!)と問題の正確なエラーメッセージ(あなたはそれを編集できます!) – mrCarnivore

答えて

2

あなたがこれから何かを得ているので、私は再びそれを分解するでしょう。私はまだ私がまだ理解していないと確信しているので、あなたの問題を解決することはできません。しかし、我々は少しそれをきれいにすることができます。

私はまだグローバル変数が好きではありません。今のところあなたのコードで何をしたいのですか?しかし、特別な状況でのみ使用する必要があるので、globalはキーワードです。しかし、return prize以来、割り当ての前後に私はreturn値でグローバルを置き換え、関数の外に代入を追加しました。ここでも、これはPythonであり、Cではありません。すべてがオブジェクトであり、一般的に参照渡しされます。したがって、物事を返すことはOKですが、その場で変更することはできません。

私の注目を引くのは、firstからfourthのリスト内包です。これについての3つのことは、最初に、それらがwithブロックで定義されていることです。つまり、 'prizes.csv'を開いている間にエラーが発生すると、未定義になる可能性があることを意味します。次に、このリストの理解は、firstが第2の値であり、secondが第1の値であるため、私はそれを並べ替えました。最後に、なぜこれを正確にやっていますか?これは、入力csvの第1列から第4列を表す値のリストを生成します。 私が推測しなければならないのは、CSVのコラムである賞を創りたいということです。とにかく少なくともその列の最初の4行。

最後に、問題はタイプエラーです。これがあなたが本当にここにいる理由です。 csv.readerの出力はstrのリストで、希望する値はintまたはfloatの値です。したがって、上記のように、文字列リテラルをPython値に読み込む安全な方法は、ast.literal_eval()関数を使用することです。これはいくつかの方法で達成できます。私はあなたのコードの中の最良の場所がリストの理解にあると思います(私はこの目的のためにそこに残しました)。 ast.literal_eval()をどこに追加したのか分かりますが、この関数は文字列を入力として受け取り、Pythonコードと同じように解析しますが、実行しません(eval()の代わりに「安全」な代替手段になります)。数字を一緒に追加すると、あなたが受け取ったタイプのエラーを取得しません。あなたはpythonがが強く型付けされた(そして動的に型付けされている)ため、そのタイプのエラーを受けていました。つまり、をintに追加することはできません。をstrに自動的に変換するわけではありません。

import ast 

def prizesFunction(): 
    first = [] 
    second = [] 
    third = [] 
    fourth = [] 

    with open('prizes.csv', 'r') as f: 
     reader = csv.reader(f) 
     prizePoints = list(reader) 
     first = [ast.literal_evel(i[0]) for i in prizePoints] 
     second = [ast.literal_evel(i[1]) for i in prizePoints] 
     third = [ast.literal_evel(i[2]) for i in prizePoints] 
     fourth = [ast.literal_evel(i[3]) for i in prizePoints] 

    choice = input('Enter your choice [0-4] : ') 
    choice = int(choice) 

    if choice == 1: 
     return first 
    elif choice == 2: 
     return second 
    elif choice == 3: 
     return third 
    elif choice == 4: 
     return fourth 

prize = prizesFunction() 

[OK]これはちょっと役立つはずです。また、それはいい見えませんか?あなたがPythonを書いているとき、それは乱雑に見え始めます...あなたはおそらくそれを非対話的にやっていません。 import this

+0

うわー、大変お返事いただき、ありがとうございます。あなたの「何をここで質問していますか」を参考に、私は各列からそれぞれの賞品ポイントを得ようとしていました。ちょうどあなたが私に与えたものをテストし、それはすべての大丈夫感謝して動作するようだ!私がこのサイトに参加したとき、あなたが今日のように誰かが非常に役に立つとは思っていませんでした。事を説明する時間を取ることは私には驚異的な恩恵をもたらしました。そして、あなたはそれを行う時間を取ることをかなり嬉しく思います! – abercrombiefan1

+1

いつでも。我々はすべて一緒になっている。 – VoNWooDSoN

2

まず最初の最初、これはPythonのではなく、Cであるので、あなたはこれがrange()の必要性を排除し

for prizeWinner in prizeWinners: 

forループを使用する必要があります。 "インデックスを知る必要がある場合はどうすればいいですか?"さて、この場合はそうでないが、あなたがした場合、ニシキヘビの方法はenumerate()

このよう
for ii,prizeWinner in enumerate(prizeWinners): 

を使用することですで私は、これは知識をひけらかすですけど、のは、この単純な変更は、あなたのコードに何をするかを見てみましょう。

def prizeHandout(prizeWinners): 
    for prizeWinner in prizeWinners: 
     if len(prizeWinners) == 24: 
      prizeWinner[2] = (int(prize[0])) 
     elif len(prizeWinners) == 12: 
      prizeWinner[2] = (int(prize[1])) 
     elif len(prizeWinners) == 6: 
      prizeWinner[2] = (int(prize[2])) 
    print(prizeWinners) 

すでに気分が良くなっています。
今、「賞はグローバル変数です」は既に良くありません。だから関数に渡す必要があり、デフォルト値を使用します。
なぜ賞をintとしてキャストしていますか?正当な理由があると確信していますが、その理由がstrintに変換している場合は、ast.literal_eval()を使用することをお勧めします。あなたの質問の残りの部分に文脈がないので、私はそれを削除しています。 賞に賞を追加するまで[2]、その変更を加えましょう。

def prizeHandout(prizeWinners, prize=[10,20,30]): 
    for prizeWinner in prizeWinners: 
     if len(prizeWinners) == 24: 
      prizeWinner[2] += prize[0] 
     elif len(prizeWinners) == 12: 
      prizeWinner[2] += prize[1] 
     elif len(prizeWinners) == 6: 
      prizeWinner[2] += prize[2] 
    print(prizeWinners) 

あなたのプログラムから私が答えられないのは、len(prizeWinners)の賞品を決定する理由です。あなたがしようとしていたと想像しているのは、配列内のどのインデックスかを確認することです。したがって、これはenumerate()が便利な場所です。サイズについてはこれを試してください。これは、入賞者のリストの先頭から25番目の場合は10を、10番目の場合は20を、7番目の場合は30を加算します。

def prizeHandout(prizeWinners, prize=[10,20,30]): 
    for ii, prizeWinner in enumerate(prizeWinners): 
     if ii == 24: 
      prizeWinner[2] += prize[0] 
     elif ii == 12: 
      prizeWinner[2] += prize[1] 
     elif ii == 6: 
      prizeWinner[2] += prize[2] 
    print(prizeWinners) 

これは私が言うことができます。あなたが私の歩みに従うことを願っています。

+0

こんにちはVoNWooDSoN、まず皆さんの包括的な答えに感謝します。あなたが私に与えた情報は、まさに私が学習を進める上で必要なものです。私が親切に提供したコードを実装しましたが、私はまだ上記のコメントで言及した 'TypeError'を取得しています。元の質問を編集して、私が何をしようとしていたかをさらに含めるようにしました。理解しやすいことに、あなたはすでに助けてくれましたが、このエラーの原因を知っていますか?ありがとう! – abercrombiefan1

関連する問題