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は、キーの存在チェックを自動で行ってくれるため、グループ化処理を簡潔に書ける便利なツールです。チュートリアルの内容について不明な点があれば、ぜひコメント欄でお知らせください。
-
なぜPythonはリスト内のリストではなく「リスト内のタプル」を返すのか?その理由を解説
Pythonでデータベースを操作したり、ライブラリからデータを取得したりすると、「リストの中にタプルが入った構造」が返ってくることがよくあります。「なぜ普通のリストではなく、わざわざタプルなのか?」と疑問に思ったことはありませんか?この記事では、その理由を分かりやすく解説します。 1. 返却されたデータは「変更しない」ことが前提だから 最大の理由は、Pythonが返却するデータはミュータブル(変更可能)にしないことを期待している点にあります。タプルはイミュータブル(不変)なデータ型であり、一度作成すると内容を書き換えることができません。 関数やライブラリがデータを返すとき、それはあくまで「読
-
Pythonでタプルの要素値を更新する方法!list()とtuple()を使った手順を解説
Pythonのタプルはイミュータブル(変更不可)なオブジェクトPythonのタプルはイミュータブル(不変)なオブジェクトです。そのため、タプルの要素を直接書き換えようとする操作は許可されておらず、エラーが発生します。ただし、いくつかの手順を踏むことで、実質的にタプルの要素値を更新することが可能です。ここでは最も一般的な回避策(ワークアラウンド)を紹介します。タプルをリストに変換してから更新する手順まず、組み込み関数 list() を使ってタプルをリストに変換します。リストはミュータブル(変更可能)なオブジェクトなので、特定のインデックスの要素に対して新しい値を代入することで、自由に内容を更新で