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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1114閲覧

配列のソートについて

kosshi_s

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/08/29 04:00

配列を出現回数の多い順、且つ同じ場合は当初の配列の順番に並べ替えたいです。
例えば、

a = [4, 6, 2, 2, 6, 4, 4, 4]

[4, 4, 4, 4, 6, 6, 2, 2]

に並べ替えたいです。

sorted(a, key=lambda x:a.count(x), reverse=True)

[4, 4, 4, 4, 6, 2, 2, 6]

と良い所までいったのですが、そこから先で今止まってしまっています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

安定ソートであることを利用して、二回に分けてソートすると楽です。

Python

1src = [4, 6, 2, 2, 6, 4, 4, 4] 2 3dst = sorted(src, key=src.index) 4dst = sorted(dst, key=src.count, reverse=True) 5print(dst)

実行結果 Wandbox

[4, 4, 4, 4, 6, 6, 2, 2]

ただしlist.indexもlist.countも線型の計算量を要するので、
本来なら前以て評価用のデータを生成しておくのが好ましいです。

例えば、こんなふうに。

Python

1key = {} 2src = [4, 6, 2, 2, 6, 4, 4, 4] 3 4for i, e in enumerate(src): 5 if e in key: 6 key[e][0] += 1 7 else: 8 key[e] = [1, -i] 9 10print(key) 11 12dst = sorted(src, key=key.get, reverse=True) 13print(dst)

実行結果 Wandbox

{4: [4, 0], 6: [2, -1], 2: [2, -2]} [4, 4, 4, 4, 6, 6, 2, 2]

発展的な方法

安定基数ソートバケットソート。

Python

1import collections 2 3 4class OrderedCounter(collections.Counter, collections.OrderedDict): 5 pass 6 7src = [4, 6, 2, 2, 6, 4, 4, 4] 8counter = OrderedCounter(src) 9 10dst = [ 11 key 12 for key, num in counter.most_common() 13 for _ in range(num) 14] 15print(dst)

参考: python - Creating an Ordered Counter - Stack Overflow

投稿2019/08/29 04:16

編集2019/08/29 04:39
LouiS0616

総合スコア35660

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

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

kosshi_s

2019/08/29 21:20

回答ありがとうございました。色々な解決法を提示いただいたこちらをベストアンサーにさせていただきます。
guest

0

python

1a = [4, 6, 2, 2, 6, 4, 4, 4] 2#a = [4, 1, 2, 2, 1, 4, 4, 4] 3sorted(a, key=lambda x:(a.count(x), -a.index(x)), reverse=True)

同じ場合は当初の配列の順番に並べ替えたいです。

この条件を見逃していたためコードを修正しました。

投稿2019/08/29 04:09

編集2019/08/29 04:23
yamap55

総合スコア1376

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

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

LouiS0616

2019/08/29 04:17

その方法だと a = [4, 1, 2, 2, 1, 4, 4, 4] のときに要件を満たしません。
yamap55

2019/08/29 04:19

なるほど。「当初の配列の順番」これがありましたね。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問