やりたいこと
例えば以下のようなリストを
[5, 4, 3, 5, 5, 5, 4, 4, 3, 2]
こうしたい場合のTipsです
[5, 5, 5, 5, 4, 4, 4, 3, 3, 2]
できあがったコード
from collections import Counter a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2] counter = Counter(a) result = [k for k, v in counter.most_common() for _ in range(v)] print(result) # [5, 5, 5, 5, 4, 4, 4, 3, 3, 2]
色々やりかたはあると思うけど、とりあえずリストを手っ取り早く要素毎に辞書形式でカウントアップしてくれるCounter
と要素数毎に返してくれるmost_common()
を使って実装してみた。
まず、対象のリストをCounter()
メソッドを使って要素: 要素数
の辞書型で返すようにする
a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2] counter = Counter(a) print(counter) # Counter({5: 4, 4: 3, 3: 2, 2: 1})
ちなみにtype
関数で型を見るとcollection
型になっている
>>> type(counter) <class 'collections.Counter'>
これをさらにmost_common()
を使って値の昇順で返すようにして、
>>> counter.most_common() [(5, 4), (4, 3), (3, 2), (2, 1)]
あとは以下のようなイメージのfor
ループを内包表記で記載すればリストの要素を頻出順でソートすることができた!
このfor
ループを
reuslt = [] for k, v in counter.most_common(): for _ in range(v): result.append(k)
こんな感じで内包表記!
result = [k for k, v in counter.most_common() for _ in range(v)]
もっと良い方法等あれば教えてつかーさい^^