3

名前のリストをスコアで並べ替えたい。私がこれまでに持っているのは

file = open("scores.txt", 'r')
for line in file:
    name = line.strip()
    print(name)
file.close()

それらを並べ替える方法がわかりません。

ファイルの内容は次のとおりです。

Matthew, 13
Luke, 6
John, 3
Bobba, 4

私が出力したいもの:

John 3
Bobba 4
Luke 6
Matthew 13

誰でも助けることができますか?

4

1 に答える 1

5

メソッドを使用し.split(',')て行を個別の部分に分割し、 を使用int()してスコアを数値に変換できます。.sort()メソッドはリストをその場でソートkeyし、何をソートするかを伝えます。

scores = []
with open("scores.txt") as f:
    for line in f:
        name, score = line.split(',')
        score = int(score)
        scores.append((name, score))

scores.sort(key=lambda s: s[1])

for name, score in scores:
    print(name, score)

これにより、(名前、スコア)ペアを含むタプルのリストがソートされた順序で表示されます。それらの間にカンマを入れて印刷したい場合(一貫性を保つために)、印刷を次のように変更しますprint(name, score, sep=', ')

入力ファイルの読み取りは、1 行 (大きな) として表現することもできます。

with open("scores.txt") as f:
    scores = [(name, int(score)) for name, score in (line.split(',') for line in f)]

の簡単な説明key=:

ラムダ関数は無名関数、つまり名前のない関数です。通常、これらは、小さな操作のためだけの関数が必要な場合に使用します。 関数を取り、その関数の戻り値をオブジェクトのソートに使用する.sortオプションのキーワード引数があります。key

したがって、これは次lambdaのようにも記述できます。

def ret_score(pair):
    return pair[1]

そして、あなたはそれを書くことができます .sort(key=ret_score) が、私たちは本当にその関数を他に必要としないので、それを宣言する必要はありません. ラムダ構文は

lambda <arguments> : <return value>

したがって、このラムダはペアを取り、その中の 2 番目の要素を返します。必要に応じて、保存しlambdaて通常の関数のように使用できます。

>>> square = lambda x: x**2 # takes x, returns x squared
>>> square(3)
9
>>> square(6)
36
于 2013-07-13T17:21:45.050 に答える