Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】Counterを使ってリスト内の重複要素を連続するように並べ替える方法

Pythonでリストを扱っていると、重複している要素同士を隣り合わせ(連続)になるように並べ替えたいケースがあります。そのような場合には、標準ライブラリ collections モジュールの Counter クラスと、空のリスト、そしてシンプルなループ処理を組み合わせることで、簡単に実現できます。

サンプルコード

以下に具体的な実装例を示します。

from collections import Counter

my_list = [21, 83, 44, 52, 61, 72, 81, 96, 18, 44]

print("The list is :")
print(my_list)

my_frequencys = Counter(my_list)
my_result = []

for value, count in my_frequencys.items():
   my_result.extend([value]*count)

print("The resultant list is :")
print(my_result)

実行結果

The list is :
[21, 83, 44, 52, 61, 72, 81, 96, 18, 44]
The resultant list is :
[21, 83, 44, 44, 52, 61, 72, 81, 96, 18]

元のリストでは離れた位置にあった「44」が、処理後には隣り合う(連続する)形に並べ替えられていることがわかります。

コードの解説

  • 必要なパッケージのインポート: collections モジュールから Counter クラスを環境にインポートします。

  • リストの定義と表示: 整数値を含むリストを定義し、コンソールに出力します。このリストでは「44」が2か所に登場しています。

  • Counterの作成: リストを Counter に渡すことで、各要素の出現回数をカウントしたオブジェクトを作成し、変数に代入します。

  • 空のリストを用意: 結果を格納するための空のリストを作成します。

  • 要素の再構築: Counter の各要素(値と出現回数)にアクセスし、「要素 × 出現回数」の分だけ extend() を使って新しいリストへ展開・追加します。これにより、同じ要素どうしが連続して並ぶことになります。

  • 結果の表示: 並べ替え後のリストがコンソールに出力され、処理が完了します。

補足:なぜこの方法が機能するのか

Python 3.7以降の Counter(および通常の辞書)は、要素が最初に出現した順序を保持するという特徴があります。そのため、items() で各要素を出現回数分だけ展開していくと、重複要素は必ず最初に出現した位置にまとめられ、結果として連続した並びになります。この手法は、要素の順序を大きく崩さずに重複をグループ化したい場合に特に有効です。

  1. Pythonでリストから指定したインデックスの複数要素を削除する方法

    Pythonのリストから単一の要素を削除するのは、del文とインデックスを組み合わせれば簡単に行えます。しかし、複数のインデックスに該当する要素をまとめて削除したいケースでは、少し工夫が必要です。本記事では、削除対象となるインデックスのリストを指定して、元のリストから該当する要素だけを取り除く方法を2つ紹介します。方法1:sorted()とdelを組み合わせるこのアプローチでは、まず削除したい位置(インデックス)を格納したリストを作成します。その後、降順にソートしてから後ろの要素から順に削除することで、削除処理中にインデックスがずれる問題を回避し、元のリストの構造を保ったまま安全に要素を削除で

  2. 【初心者向け】Pythonでリストのサイズ(要素数)を取得する方法

    リスト(list)は、Pythonにおける代表的なコレクション型のデータ構造の一つです。リストの要素は後から変更でき、重複した値を持つこともできます。本記事では、Pythonでリストのサイズ(長さ)を取得する方法を解説します。具体的には、重複の有無にかかわらず、リストに含まれる全要素の数をカウントする方法を紹介します。リストの長さを取得する基本:len()関数Pythonでリストの要素数を取得するには、組み込み関数の len() を使用します。len() はリストだけでなく、タプル・文字列・辞書などさまざまなコレクションに対しても利用できる汎用的な関数です。サンプルコード以下の例では、「day