Pythonでリストから重複を削除する方法!dict.fromkeys()とset()の使い分けを解説
Pythonでリストを扱っていると、重複した要素を削除したい場面に出くわすことがあります。例えば、レストランのシェフが旧メニューと新メニューを統合する場合、両方を組み合わせたときに発生する重複を取り除きたいはずです。
この記事では、dict.fromkeys()メソッドを使う方法と、リストをセット(set)に変換する方法という、2つの代表的なアプローチを解説します。それぞれの出力をリストに戻す手順についても触れ、データをリストとして扱えるようにします。
Pythonでリストから重複を削除する2つの方法
リストから重複を削除するには、主に以下の2つの方法があります。
- dict.fromkeys()メソッド:リストを辞書に変換する。辞書は重複したキーを持てないため、一意な値だけが残る。
- セット(set)への変換:セットも辞書と同様に重複した値を格納できないため、リストをセットに変換すると重複が自動的に削除される。
どちらの方法でも、最後にlist()で辞書やセットをリストに戻すことで、重複が削除されたリストを取得できます。
dict.fromkeys()メソッドで重複を削除する
Pythonの辞書(dictionary)は、キーと値のペアでデータを管理するデータ構造です。辞書には重複したキーを含めることができないため、リストを辞書に変換すると、重複した値が自動的に取り除かれます。この性質を活用するのがfromkeys()メソッドです。
dict.fromkeys()の構文
fromkeys()は、指定したキーから新しい辞書を生成する組み込み関数です。辞書は重複したキーを持てないため、この関数を使うことでリスト内の重複値が削除されます。その後、辞書を再びリストに変換すれば完成です。
dictionary_name.fromkeys(keys, value)
fromkeys()は「keys」と「value」の2つのパラメータを受け取ります。
- keys:新しい辞書のキーとなるイテラブル(反復可能オブジェクト)。ここにリストを渡します。
- value(省略可):すべてのキーに共通して設定する値。今回の用途では不要なので省略します。
dict.fromkeys()の使用例
ここでは、ピザ屋のシェフが旧メニューと新メニューを1つの大きなメニューに統合する場面を想定しましょう。新メニューには数か月かけて開発した新しいピザが含まれていますが、旧メニューのピザも引き続き提供したいところです。ただし、メニューに同じピザが重複して表示されるとお客様が混乱してしまうため、重複は事前に取り除く必要があります。
新メニューに含まれる重複を削除するには、次のようなコードを実行します。
new_menu = ['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Hawaiian', 'Bacon', 'Black Olive Special', 'Sausage', 'Sausage'] final_new_menu = list(dict.fromkeys(new_menu)) print(final_new_menu)
このコードを実行すると、重複した要素が削除され、以下が出力されます。
['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Bacon', 'Black Olive Special', 'Sausage']
最初の行では、新メニューのすべてのピザを格納する変数new_menuを宣言しています。このリストには重複値が含まれており、「Sausage」と「Hawaiian」がそれぞれ2回登場している点に注目してください。
続いて、dict.fromkeys()メソッドを使ってnew_menuから辞書を作成し、さらにlist()でその辞書をリストに変換しています。最後の行で、修正されたリストを出力します。
実行結果を見ると、プログラムによって重複値が削除され、「Sausage」と「Hawaiian」が新しいリストに1回だけ表示されていることがわかります。
ポイント:dict.fromkeys()を使う方法の利点は、元のリストの要素の順序が保持されることです。Python 3.7以降の辞書は挿入順を維持するため、重複削除後も元の並び順のままになります。
セット(set)で重複を削除する
Pythonのセット(set)オブジェクトは、順序なし(unordered)かつインデックスなし(unindexed)のデータ構造で、一意な要素のみを格納できます。リストとは異なり、セットは重複した値を保持できません。
そのため、リストをセットに変換するだけで重複を取り除くことができます。Pythonでは、セットは波括弧 {} で囲まれたカンマ区切りの要素として表現されます。以下はピザの名前を格納するセットの例です。
pizzas = {'Margherita', 'Hawaiian', 'Mushroom', 'Meat Feast'}
セットを使った重複削除の例
先ほどの例を使って、セットで重複値を削除する方法を見てみましょう。同じく、旧メニューと新メニューを統合するシェフのケースです。最終的なメニューを作る前に、メニュー間の重複を取り除きます。セットを使ったコードは次のとおりです。
new_menu = ['Hawaiian', 'Margherita', 'Mushroom', 'Prosciutto', 'Meat Feast', 'Hawaiian', 'Bacon', 'Black Olive Special', 'Sausage', 'Sausage'] final_new_menu = list(set(new_menu)) print(final_new_menu)
重複値を削除した後のリストは以下のようになります。
['Mushroom', 'Black Olive Special', 'Meat Feast', 'Bacon', 'Margherita', 'Sausage', 'Prosciutto', 'Hawaiian']
プログラムの冒頭で、新メニューのすべてのピザを格納するリストnew_menuを宣言しています。
次に、修正後のメニューを格納する変数final_new_menuを宣言します。この変数では、set()を使ってnew_menuをセットに変換し、その後list()でセットをリストに戻しています。この処理により、new_menu内のすべての重複値が削除されます。
最後に、プログラムが新しいメニューをコンソールに出力します。元のリストの一意な要素だけが表示され、重複のないリストが完成しました。
注意点:セットは順序を持たないため、set()を使う方法では元のリストの並び順が保持されません。出力結果を見ると、要素の順序が入れ替わっているのがわかります。順序を維持したい場合は、前述のdict.fromkeys()を使う方法を選びましょう。
まとめ
リストから重複した要素を削除するのは、Pythonにおけるよくある操作のひとつです。公式に定められた唯一の方法は存在せず、最も一般的なアプローチは、辞書のfromkeys()関数を使う方法と、データをセットに変換する方法の2つです。
- dict.fromkeys():要素の順序を保持したい場合に最適。
- set():順序が不要で、シンプルに重複を排除したい場合に便利。
この記事では、Pythonでリストから重複を削除するために、辞書のfromkeys()関数とセットを使う方法を解説しました。状況に応じて適切な方法を選択し、クリーンなデータを扱えるようにしましょう。
-
【Android】ソート済みリンクリストから重複を削除する方法をわかりやすく解説
はじめに この記事では、Androidアプリ開発において、ソート済みのリンクリスト(LinkedList)から重複する要素を削除する方法を解説します。Java標準ライブラリのLinkedHashSetを活用すれば、要素の順序を保ったまま重複だけを簡単に除去できます。 実装手順 ステップ1:新規プロジェクトの作成 まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」⇒「New Project」を選択し、必要な項目を入力してプロジェクトを生成してください。 ステップ2:レイアウトファイル(activity_main.xml)の編集 次に、res/layout
-
【Python】Tkinterでラベルのテキストを削除する方法をわかりやすく解説
Tkinterは、PythonでGUIベースのアプリケーションを作成・開発するための標準ライブラリです。この記事では、何らかのテキストが表示されているラベルから、そのテキストを削除する方法を解説します。 ラベルからテキストを削除するには、ラベルの表示を切り替えるトリガーとして機能するボタンを作成します。具体的には、config()メソッドを使ってラベルのtext属性を空の文字列に書き換えます。 サンプルコード # Tkinterライブラリをインポート from tkinter import * # tkinterフレームのインスタンスを作成 win = Tk() # ウィンドウのサイズを