3

私は次のタプルを持っています:

['Southampton', '9', '14', '13']
['Nottingham Forest', '8', '10', '17']
['Coventry City', '7', '4', '14']
['Blackburn Rovers', '4', '6', '14']
['Newcastle United', '24', '20', '10']
['FC Wimbledon', '21', '20', '11']
['Arsenal', '21', '19', '8']

そして、2列目と3列目で並べ替えたいと思います。だから私は次のコードを使用します:

sorted_rank = sorted(temp_rank, key=itemgetter(1,2), reverse=True)

ただし、ご覧のとおり、2番目と3番目の列はintではないため、並べ替えプロセスは正しく終了しませんでした。これらの列が文字列ではなく整数であることをPythonに「伝える」にはどうすればよいですか?

私はこれを試しましたが、何もしませんでした:

sorted_rank = sorted(temp_rank, key=itemgetter(1,int(2)), reverse=True)
4

3 に答える 3

6

代わりに、カスタム関数またはラムダを指定する必要があります。

次の作品:

sorted_rank = sorted(temp_rank, key=lambda i: (int(i[1]), int(i[2])), reverse=True)

どこにsorted_rankなりますか:

[['Newcastle United', '24', '20', '10'],
 ['FC Wimbledon', '21', '20', '11'],
 ['Arsenal', '21', '19', '8'],
 ['Southampton', '9', '14', '13'],
 ['Nottingham Forest', '8', '10', '17'],
 ['Coventry City', '7', '4', '14'],
 ['Blackburn Rovers', '4', '6', '14']]
于 2012-12-11T15:46:34.167 に答える
2
def key_fct(tup):
    return (int(tup[1]), int(tup[2]))

sorted_rank = sorted(temp_rank, key=key_fct, reverse=True)
于 2012-12-11T15:47:35.350 に答える
1

試したことがうまくいかない理由を理解するために、それが何であるかを確実に理解しましょうitemgetter(1, 2)。まずitemgetter、関数です。しかし、もっと重要なことは、それは関数を返す関数であり、返された関数は、ソートのキー関数として使用しているものです。文字列をintにキャストしようとしても機能しなかった理由を確認するためにitemgetter、常に2つの引数をとるバージョンを実装しましょう。

def itemgetter(i, j):
    def fn(e):
        return (e[i], e[j])
    return fn

キーとして使用されるのは、内部関数の戻り値ですfn。あなたがしたことはj、ではなくintにキャストされましたe[j]。これを行うには、の結果をキャプチャしfn、キャストを実行してから、結果を返す必要があります。

def keyfunc(e):
    return tuple(int(x) for x in itemgetter(1, 2)(e))

そして、それを使用して正しく並べ替えを実行できます。

sorted_rank = sorted(temp_rank, key=keyfunc, reverse=True)
于 2012-12-11T15:58:11.090 に答える