Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

[python]List内の値の順位を昇順/降順で取得する

More than 1 year has passed since last update.

記事の内容

PythonのListの値の順位を昇順/降順で取得したい。
昇順は調べるとすぐに見つかりましたが、降順は少し工夫が必要だったのでメモとして残します。

コード

早速、コードです。

sample.py
from scipy.stats import rankdata

# 対象のデータ
array = [10,30,30,40,20]

# rankdataでインデックス毎の順位を取得
asc = rankdata(array)

# 昇順の表示
print(type(asc))
print(asc.astype(float))

# 降順の計算
desc = (len(asc) - asc + 1).astype(float)

# 降順の表示
print(type(desc))
print(desc)

降順はrankdataに降順で取得する処理が実装されていない様なので計算する必要がありました。
色々試してみた結果、これが一番簡単に出来そうな気がします。

以下、実行結果です。

<class 'numpy.ndarray'>
[1. 3. 5. 4. 2.]
<class 'numpy.ndarray'>
[5. 3. 1. 2. 4.]

astypeをastype(int)に変更すると

<class 'numpy.ndarray'>
[1 3 5 4 2]
<class 'numpy.ndarray'>
[5 3 1 2 4]

こうなります。

この状態で同じ値が入っていると・・

# 対象のデータ
array = [10,30,30,40,20]
<class 'numpy.ndarray'>
[1 3 3 5 2]
<class 'numpy.ndarray'>
[5 2 2 1 4]

こうなります。結果が変わってしまいました・。
floatのままだと

<class 'numpy.ndarray'>
[1.  3.5 3.5 5.  2. ]
<class 'numpy.ndarray'>
[5.  2.5 2.5 1.  4. ]

こうなります。

データに被りがない時、限定のやり方ということで・・。

追記

konandoirusa さんよりご指摘頂いた方法の方が圧倒的に簡単なので追記

sample.py
import numpy as np
from scipy.stats import rankdata
# 対象のデータ
array = [10,30,30,40,20]

# 昇順
print(rankdata(np.array(array)))
# 降順
print(rankdata(-np.array(array)))

実行結果

[1.  3.5 3.5 5.  2. ]
[5.  2.5 2.5 1.  4. ]
bc_yuuuuuki
ブロックチェーン/AI/Python/Golang/MongoDB/GraphDBなどを学習中です。 このサイトにおける掲載内容はあくまで私自身の見解であり、必ずしも私の所属団体・企業における立場、戦略、意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away