1

Python のタプルで構成されるリストがあります。各タプルの各インデックスを参照して、NBA プレーヤーの統計のリストを作成する必要があります。タプルの最初のインデックス [0] は効率性評価で、次の 2 つの位置はプレーヤー名とチーム名です。現在、タプルは長いリストにあります。プログラムを実行すると、さまざまなタプルのリストではなく、最初の 4 つのタプルの出力しか得られません。append を使用しようとしましたが、それも役に立ちませんでした。

これが私のコードです:

def get_data_list (file_name):
    data_file = open(file_name, "r")
    data = []
    player_list=[]
    for line_str in data_file:

        # strip end-of-line, split on commas, and append items to list
        data_list =line_str.strip().split(',')

        data_list.append (data)

        gp=int(data_list[6])
        mins=int(data_list[7])
        pts=int(data_list[8])
        oreb=int(data_list[9])
        dreb=int(data_list[10])
        reb=int(data_list[11])
        asts=int(data_list[12])
        stl=int(data_list[13])
        blk=int(data_list[14])
        to=int(data_list[15])
        pf=int(data_list[16])
        fga=int(data_list[17])
        fgm=int(data_list[18])
        fta=int(data_list[19])
        ftm=int(data_list[20])
        tpa=int(data_list[21])
        tpm=int(data_list[22])



        efficiency = ((pts+reb+asts+stl+blk)-(fgm-ftm-to))/gp        

       data_list.append (efficiency)
       data.append(data_list)
       score=data_list[24]
       first_name=data_list[2]
       last_name=data_list[3]
       team_name=data_list[4]
       player_tuple = score, last_name, first_name, team_name

       player_list.append(player_tuple)

       a=sorted(player_list)

       a.reverse()

   return a

def print_results (lst):
   """Print the result in a nice format"""
    print("The top 50 players based on efficiency are: ")
    print('*'*75)
    print('{:<20s}{:<20s}, {:<15s}{:<5s}'.format(lst[(0)],lst[(1)],lst[(2)],lst[(3)]))

file_name1 = input("File name: ")

result_list = get_data_list (file_name1)

top_50_list=[]
top_50_list=result_list[:50]

print_results(top_50_list)

私の問題は print_results 関数にあると思います。

私は入門クラスを取っているので、高度なオプションの多くは私にはオプションではないことを覚えておいてください. 解決策はシンプルにしてください。

ボリバー

4

3 に答える 3

0

print_results

def print_results (lst):
   """Print the result in a nice format"""
    print("The top 50 players based on efficiency are: ")
    print('*'*75)
    print('{:<20s}{:<20s}, {:<15s}{:<5s}'.format(lst[(0)],lst[(1)],lst[(2)],lst[(3)]))

のようなものかもしれません

def print_results(lst):
  """Print the result in a nice format"""
  print("The top 50 players based on efficiency are: ")
  print('*'*75)
  for player_tuple in lst:
     print('{:<20s}{:<20s}, {:<15s}{:<5s}'.format(*player_tuple[:4]))

タプルのリストがあるので、各タプルはプレーヤーを表し、各プレーヤーをループして情報を出力します

于 2012-12-06T19:57:10.480 に答える
0

あなたの問題は追加機能にあるようです...

a=[some,list]
a.append(42) #a = [some,list,42]
a.append([1,2]) #now a = [some,list,42,[1,2]]

あなたにとって、インデックス0はそれ自体が空のリストです

したがって、コードでは、ループの最初の繰り返しで次のようになります。

data_list =line_str.strip().split(',')  # data_list = [some,list]
data_list.append (data)                 # data_list = [some,list,[]]  
...
data_list.append (efficiency)           # data_list = [some,list,[],efficiency]
data.append(data_list)                  # data = [[some,list,[],efficiency]]
...
a = something special

その後、ループは入力ファイルの最後の行まで続きます

その後、戻りaます。aは一度だけ返され、前述のシャッフルのために厄介です。

for ループをいじって少し追加すれば、問題なく解決するはずです。

勇気があれば、上を見上げてyieldください。発電機はここに最適です

于 2012-12-06T20:07:58.363 に答える
0

dataあなたのコードが対で何をしようとしているのか理解できませんdata_list。を取り除くために書き直しましたdata。また、計算した後、efficiencyそれをリストに追加しますが、その後、リストから再びscore. 私は単にそれを取り除きました。

ファイルを操作するには、ステートメントを使用するのがベスト プラクティスwithなので、そのように書き直しました。

また、文字列項目を一度に 1 つずつ整数に変換していますが、リスト内包表記を使用してすべてを一度に行うことができます。リスト内包表記を使うとコードがきれいになるので、リスト内包表記が問題にならないことを願っています。最初のリスト内包表記は、.strip()名前の 3 つの文字列のそれぞれに対してメソッド関数を呼び出します。2 番目のものは、すべての整数を 1 つの便利な方法で変換します。

という名前の一時リストを作成してaからそのリストを逆にする代わりに、 でreverse=Trueオプションを指定しただけsorted()です。これで、リストが逆の順序で作成されました。必要なものだけです。

他の人が指摘したように、印刷機能にはリスト内のものを印刷するためのループが必要です。print 関数のメッセージは上位 50 を出力すると言っているので、リストのスライスを print 関数内で行うように変更しました。現在、print 関数は、印刷するアイテムの数を指定するオプションの引数を取ります。デフォルト値は 50 であるため、別の値を指定しない場合、上位 50 項目が出力されます。

実行する必要はありませんがif __name__ == __main__:、コードの前に置くという一般的な Python 機能があります。ここで説明を見ることができます: What does if __name__ == "__main__": do?

def get_data_list (file_name):
    player_list=[]
    with open(file_name, "r") as f:
        for line in f:
            # split line on commas, and convert items to integer values
            # make a list of the integer values.
            items = line.split(',')

            first_name = items[2].strip()
            last_name = items[3].strip()
            team_name = items[4].strip()

            data_list = [int(x) for x in items[6:]
            gp = data_list[0]
            mins = data_list[1]
            pts = data_list[2]
            oreb = data_list[3]
            dreb = data_list[4]
            reb = data_list[5]
            asts = data_list[6]
            stl = data_list[7]
            blk = data_list[8]
            to = data_list[9]
            pf = data_list[10]
            fga = data_list[11]
            fgm = data_list[12]
            fta = data_list[13]
            ftm = data_list[14]
            tpa = data_list[15]
            tpm = data_list[16]

            efficiency = ((pts+reb+asts+stl+blk)-(fgm-ftm-to))/gp        

            player_tuple = efficiency, last_name, first_name, team_name

            player_list.append(player_tuple)

    return sorted(player_list, reverse=True)

def print_results(lst, how_many=50):
    """Print the result in a nice format"""
    template = '{:<20}{:<20s}, {:<15s}{:<5s}'

    print("The top {} players based on efficiency are: ".format(how_many))
    print('*'*75)
    for tup in lst[:how_many]:
        print(template.format(tup[0], tup[1], tup[2], tup[3]))

if __name__ == "__main__":
    file_name1 = input("File name: ")
    result_list = get_data_list(file_name1)
    print_results(result_list)

これからさらに滑らかにしていきます。これは Python のより高度な機能を使用していますが、それらは単にトリッキーなものではなく、より便利にするための機能です。

まず、リスト内包表記を使用してリストを作成し、インデックス番号で項目を選択する代わりに、ジェネレーター式を使用して、項目を変数名に直接アンパックします。ジェネレーター式はリスト内包表記に似ていますが、リストを作成する代わりに、ループできる "反復子" を提供したり、ここで示したように変数名にアンパックしたりできる点が異なります。

次に、print 関数では、タプル内のすべての値を順番に出力したいだけです。*Python はショートカットを提供します:への呼び出し内のタプルの前にa を置くことは、.format()「これをアンパックし、アンパックされた値をこの関数呼び出しの引数として使用する」ことを意味します。

def get_data_list (file_name):
    player_list=[]
    with open(file_name, "r") as f:
        for line in f:
            # Split line on commas and convert each item to integer.  Unpack
            # values directly into variable names.  We are using a
            # generator expression to convert all the items to integer,
            # and Python's ability to unpack an iterator into a tuple.
            items = line.strip().split(',')

            # use list slicing to select just the three string values
            first_name, last_name, team_name = (s.strip() for s in items[2:5])

            # Use a generator expression to convert all values to int.
            # Unpack directly to variable names using tuple unpacking.
            # Put parentheses so Python won't worry about multiple lines
            # of variable names.
            (
                gp, mins, pts, oreb, dreb, reb, asts,
                stl, blk, to, pf, fga, fgm, fta, ftm,
                tpa, tpm
            ) = (int(x) for x in items[6:])

            efficiency = ((pts+reb+asts+stl+blk)-(fgm-ftm-to))/gp        

            player_tuple = efficiency, last_name, first_name, team_name

            player_list.append(player_tuple)

    return sorted(player_list, reverse=True)

def print_results(lst, how_many=50):
    """Print the result in a nice format"""
    template = "{:<20}{:<20s}, {:<15s}{:<5s}"

    print("The top {} players based on efficiency are: ".format(how_many))
    print('*'*75)
    for player_tuple in lst[:how_many]:
        print(template.format(*player_tuple))

if __name__ == "__main__":
    file_name1 = input("File name: ")
    result_list = get_data_list(file_name1)
    print_results(result_list)

編集:そして、ここに別の編集バージョンがあります。これは、行を に解析するためのロジックをplayer_tuple独自の関数に分割します。これにより、get_data_list()非常に短くなります。

def player_tuple(line):
    # Split line on commas and convert each item to integer.  Unpack
    # values directly into variable names.  We are using a
    # generator expression to convert all the items to integer,
    # and Python's ability to unpack an iterator into a tuple.
    items = line.strip().split(',')

    # use list slicing to select just the three string values
    first_name, last_name, team_name = (s.strip() for s in items[2:5])

    # use a generator expression to convert all values to int
    # unpack directly to variable names using tuple unpacking
    (
        gp, mins, pts, oreb, dreb, reb, asts,
        stl, blk, to, pf, fga, fgm, fta, ftm,
        tpa, tpm
    ) = (int(x) for x in items[6:])

    efficiency = ((pts+reb+asts+stl+blk)-(fgm-ftm-to))/gp        

    return efficiency, last_name, first_name, team_name

def get_data_list(file_name):
    with open(file_name, "r") as f:
        player_list = [player_tuple(line) for line in f]
    return sorted(player_list, reverse=True)

def print_results(lst, how_many=50):
    """Print the result in a nice format"""
    template = "{:<20}{:<20s}, {:<15s}{:<5s}"

    print("The top {} players based on efficiency are: ".format(how_many))
    print('*'*75)
    for player_tuple in lst[:how_many]:
        print(template.format(*player_tuple))

if __name__ == "__main__":
    file_name1 = input("File name: ")
    result_list = get_data_list(file_name1)
    print_results(result_list)

関数として持っているので、さらにplayer_tuple()単純化できます。get_data_list()プログラム全体を繰り返すのではなく、単純化しget_data_list()た . これは、この問題を解決しなければならないとしたら、おそらく私が書くコードです。

def get_data_list(file_name):
    with open(file_name, "r") as f:
        return sorted((player_tuple(line) for line in f), reverse=True)

ここでは、リストを明示的に作成することさえしません。すべての値を提供するジェネレータ式を作成し、player_tupleそれを に直接渡しsorted()ます。このリストに内部で名前を付ける必要はありませんget_data_list()。1行でビルドして返すことができます。

于 2012-12-06T20:54:01.460 に答える