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行でビルドして返すことができます。