質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

6回答

634閲覧

Python リストの並び替えについて

退会済みユーザー

退会済みユーザー

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/06 11:26

こんにちは、
例えばゲームでインデックス0番目、1番目、2番目の人が勝利した回数をリストに[0,2,1]と書くとします。勝利した回数が1番多い人がランキングの0番目、2番目に多い人が1番目、1番少なかった人がランキングの下位である2番目になるようなリストを作りたいですが、その際、昇順や降順の順でなく、元のリストのポジションにランキングを対応させてリストを作りたいです。
この場合だと、元リスト(勝利した回数)=[0,2,1]で作りたいランキングリストは、index(0)は勝利した回数が1番少ないから=2,index(1)は勝利した回数が1番多いから=0 そして2番目に勝利回数が多いのはindex(2)なので、=1
になり作りたいリストは[2,0,1]です。
このとき、勝利した回数が同じであれば元のリストの順になります。例) [1,1,0]→[0,1,2]
sortedメソッドや argsort について調べて見ましたが、やはり自分が作りたいリストにならないです。
きちんと説明できてないかもしれないですが、アドバイスお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

やりたいことは、argsortを二回やればできそうです。
numpyのargsortで、reverseかつstableなのはちょっと面倒そうなので、リストでやってます。
(もっといい方法がありそうな気もします)

python

1a = [0, 2, 1] 2b = sorted(range(len(a)), key=lambda x: a[x], reverse=True) 3c = sorted(range(len(b)), key=lambda x: b[x]) 4print(c) 5#[2, 0, 1] 6 7a = [1, 1, 0] 8b = sorted(range(len(a)), key=lambda x: a[x], reverse=True) 9c = sorted(range(len(b)), key=lambda x: b[x]) 10print(c) 11#[0, 1, 2]

numpyを使うなら、-1をかけてargsortすれば降順にソートできるので、シンプルに下記にできそうです。

python

1import numpy as np 2 3a = np.array([0, 2, 1]) 4b = np.argsort(np.argsort(-a, kind='stable')) 5print(b) 6#[2 0 1]

投稿2021/11/06 13:41

編集2021/11/06 13:50
bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

ベストアンサー

まずは元リストのインデックスを保持したまま値でソートします。
次に、欲しい結果が[0,2,1]の場合[2,0,1]で、[1,1,0]の場合[0,1,2]とのことなので
同じ大きさのリストを用意して、ソートされたインデックスの位置に連番をセットしていけばよいです。
numpy.argsortを使えば少し簡潔に書けます。

Python

1for lst in [[0,2,1],[1,1,0]]: 2 idxs = [p[0] for p in sorted(enumerate(lst), key=lambda e:(e[1],-e[0]), reverse=True)] # 方法1 3 #idxs = np.argsort(np.array(lst)*-1, kind='stable') # 方法2 4 5 ret = [0 for _ in range(len(lst))] 6 for i,pos in enumerate(idxs): 7 ret[pos] = i 8 print(lst,ret)

投稿2021/11/06 13:18

編集2021/11/06 13:22
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

kyokio さんのアイデアでいいと思います。

python

1li1 = [0,2,1] 2li2 = [(i,li1[i]) for i in range(0, len(li1))] 3li3 = sorted(li2, key=lambda x: x[1], reverse=True) 4li4 = [y[0] for y in li3] 5print(li4)

投稿2021/11/06 12:54

takasima20

総合スコア7464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Python

1def get_rank(lst): 2 ls = [(v,i) for i,v in enumerate(lst)] 3 ls2 = [v for v in sorted(ls, key=lambda x:(x[0],-x[1]), reverse=True)] 4 return [ls2.index(v) for v in ls] 5 6wins = [0, 2, 1] # 勝利した回数 7rank = get_rank(wins) 8print(rank) # [2, 0, 1] ランキングリスト 9wins = [1, 1, 0] 10rank = get_rank(wins) 11print(rank) # [0, 1, 2] 12wins = [1, 1, 2, 0, 2, 2, 1] 13rank = get_rank(wins) 14print(rank) # [3, 4, 0, 6, 1, 2, 5]

投稿2021/11/06 14:19

lehshell

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

辞書を使ってはどうでしょうか?

Python

1ranking_dict = {0:0, 1:2, 2:1} 2print(ranking_dict) 3# {0: 0, 1: 2, 2: 1} 4ranking_list = sorted(ranking.items(), key=lambda x:x[1], reverse=True) 5print(ranking_list) 6# [(1, 2), (2, 1), (0, 0)]

Pythonの辞書の要素をソートする方法【初心者向け】

投稿2021/11/06 11:44

meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

普段C++を書いているのでpythonで上手く書けないですが、リストにpairで[買った数、自分のインデックス]を持たせて買った数でsortして自分のインデックスの方を出力すればいいのではないでしょうか?

python

1list = [[0, 0], [2, 1], [1, 2]] 2ans = [x[1] for x in sorted(list, reverse=True)] 3print(ans) 4# [1, 2, 0]

投稿2021/11/06 11:46

編集2021/11/06 11:48
kyokio

総合スコア560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問