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

Pythonでタプルのリストを2番目の要素ごとにグループ化する方法

このチュートリアルでは、リスト内のタプルを「2番目の要素」が同じもの同士でグループ化するプログラムを作成します。まずは具体例を見て、処理のイメージを掴みましょう。

入力例

[('Python', 'tutorialspoints'), ('Management', 'other'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints'), ('Social', 'other'), ('Business', 'other')]

出力例

{'tutorialspoints': [('Python', 'tutorialspoints'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints')],
'other': [('Management', 'other'), ('Social', 'other'), ('Business', 'other')]}

このように、リスト内の各タプルを2番目の要素をキーとして分類していきます。それでは、解決までの手順を順番に見ていきましょう。

  • 必要なタプルを含むリストを初期化します。
  • 空の辞書を作成します。
  • タプルのリストを反復処理します。
    • タプルの2番目の要素がすでに辞書に存在するかどうかを確認します。
    • 存在する場合は、現在のタプルをそのキーに紐づくリストへ追加します。
    • 存在しない場合は、現在のタプルを含む新しいリストでキーを初期化します。
  • 最終的に、目的の形式でグループ化された辞書が完成します。

サンプルコード(通常の辞書を使用)

# タプルを含むリストを初期化
tuples = [('Python', 'tutorialspoints'), ('Management', 'other'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints'), ('Social', 'other'), ('Business', 'other')]

# 空の辞書
result = {}

# タプルのリストを反復処理
for tup in tuples:
    # 辞書にキーが存在するか確認
    if tup[1] in result:
        # 現在のタプルを既存のリストに追加
        result[tup[1]].append(tup)
    else:
        # 新しいキーをリストで初期化
        result[tup[1]] = [tup]

# 結果を出力
print(result)

出力

上記のコードを実行すると、次のような結果が得られます。

{'tutorialspoints': [('Python', 'tutorialspoints'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints')], 'other': [('Management', 'other'), ('Social', 'other'), ('Business', 'other')]}

defaultdictを使ったよりシンプルな方法

上記のプログラムでは、if文を使ってキーの存在確認を行っていました。しかし、標準ライブラリ collections のdefaultdictを利用すれば、この条件分岐を省略でき、コードをさらに簡潔にできます。実際に書き方を見てみましょう。

サンプルコード(defaultdictを使用)

# collectionsからdefaultdictをインポート
from collections import defaultdict

# タプルを含むリストを初期化
tuples = [('Python', 'tutorialspoints'), ('Management', 'other'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints'), ('Social', 'other'), ('Business', 'other')]

# defaultdict(list)で辞書を作成
result = defaultdict(list)

# タプルのリストを反復処理
for tup in tuples:
    # キーが存在しなければ自動的に空リストが生成されるため、直接appendできる
    result[tup[1]].append(tup)

# 結果を出力(通常の辞書に変換して表示)
print(dict(result))

出力

上記のコードを実行すると、先ほどと同じ結果が得られます。

{'tutorialspoints': [('Python', 'tutorialspoints'), ('Django', 'tutorialspoints'), ('React', 'tutorialspoints')], 'other': [('Management', 'other'), ('Social', 'other'), ('Business', 'other')]}

まとめ

この問題は、実装の好みに応じてさまざまなアプローチで解くことができます。本記事では、通常の辞書を使う方法と、defaultdictを使う方法という代表的な2つの手法を紹介しました。特にdefaultdictは、キーの存在チェックを自動で行ってくれるため、グループ化処理を簡潔に書ける便利なツールです。チュートリアルの内容について不明な点があれば、ぜひコメント欄でお知らせください。

  1. なぜPythonはリスト内のリストではなく「リスト内のタプル」を返すのか?その理由を解説

    Pythonでデータベースを操作したり、ライブラリからデータを取得したりすると、「リストの中にタプルが入った構造」が返ってくることがよくあります。「なぜ普通のリストではなく、わざわざタプルなのか?」と疑問に思ったことはありませんか?この記事では、その理由を分かりやすく解説します。 1. 返却されたデータは「変更しない」ことが前提だから 最大の理由は、Pythonが返却するデータはミュータブル(変更可能)にしないことを期待している点にあります。タプルはイミュータブル(不変)なデータ型であり、一度作成すると内容を書き換えることができません。 関数やライブラリがデータを返すとき、それはあくまで「読

  2. Pythonでタプルの要素値を更新する方法!list()とtuple()を使った手順を解説

    Pythonのタプルはイミュータブル(変更不可)なオブジェクトPythonのタプルはイミュータブル(不変)なオブジェクトです。そのため、タプルの要素を直接書き換えようとする操作は許可されておらず、エラーが発生します。ただし、いくつかの手順を踏むことで、実質的にタプルの要素値を更新することが可能です。ここでは最も一般的な回避策(ワークアラウンド)を紹介します。タプルをリストに変換してから更新する手順まず、組み込み関数 list() を使ってタプルをリストに変換します。リストはミュータブル(変更可能)なオブジェクトなので、特定のインデックスの要素に対して新しい値を代入することで、自由に内容を更新で