Pythonリストから重複アイテムを削除する5つの方法

公開: 2022-07-05

このチュートリアルでは、Pythonリストから重複するアイテムを削除する方法を学習します。

Pythonでリストを操作している場合、重複を削除することで、リスト内の一意のアイテムのみを操作する必要がある場合があります。

これを行うには、いくつかの異なる方法があります。 このチュートリアルでは、そのような5つのテクニックについて説明します。

Pythonリストの基本

Pythonリストの基本を確認することから始めましょう。

Pythonリストは変更可能です。 したがって、リストに要素を追加したり、リストから要素を削除したりすることで、それらをその場で変更できます。 さらに、Pythonリストは、必ずしも一意ではない要素のコレクションです。

では、どのようにして一意の要素のみを保持し、重複または繰り返しの要素を削除するのでしょうか。

さて、あなたはいくつかの異なる方法でこれを行うことができます。 元のリストの一意の要素のみを含む新しいリストを作成することもできます。 または、元のリストを変更して、重複するアイテムを削除することもできます。

このチュートリアルでは、これらについて詳しく学習します。

Pythonリストから重複を削除する方法

実際の例を見てみましょう。 あなたが友達の誕生日パーティーにいるとしましょう。

展示されているスイーツのコレクションには、繰り返されるアイテムがいくつかあります。 ここで、これらの重複するアイテムをお菓子のリストから削除します。

リストから重複を削除

上の画像のすべてのアイテムを含むsweetsリストを作成しましょう。

 sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

上記のsweetsリストでは、「キャンディー」と「カップケーキ」の項目が2回繰り返されています。 このサンプルリストを使用して、重複するアイテムを削除してみましょう。

Pythonリストを繰り返し処理して、重複を削除します

最も簡単な方法は、各アイテムを1回だけ含む新しいリストを作成することです。

以下のコードセルをお読みください。

 unique_sweets = [] for sweet in sweets: if sweet not in unique_sweets: unique_sweets.append(sweet) print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • 空のリストunique_sweetsを初期化します。
  • sweets listをループしながら、各sweetにアクセスします。
  • sweetunique_sweetsリストにまだ存在しない場合は、 .append()メソッドを使用してunique_sweetsリストの最後に追加します。

たとえば、 sweetsリストで2番目に出現する「キャンディー」などの繰り返しアイテムに遭遇したとします。 これはすでに存在するため、 unique_sweetsリストには追加されませsweet not in unique_sweets 「cupcake」と「candy」の2番目の出現に対してFalseと評価されます。

したがって、このメソッドでは、すべてのアイテムがunique_sweetsリストに1回だけ出現し、繰り返しは発生しません。

リスト内包表記を使用して重複を削除する

リスト内包表記を使用して、 unique_sweetsリストにデータを入力することもできます。

リスト内包表記の基本を更新してみませんか?

️Pythonのリスト内包表記に関するチュートリアルを確認してください。

リスト内包表現を使用してみましょう: [条件がTrueの場合に反復可能なアイテムの出力]上記のループを簡潔に書き直します。

 unique_sweets = [] [unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets] print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

新しいリストを作成している場合でも、作成したリストに値を入力していません。 これは、出力がunique_sweetsリストへの.append()操作であるためです。

Pythonリストから重複するアイテムを削除するには、組み込みのリストメソッドを使用することもできます。これについては、次のセクションで説明します。

組み込みのリストメソッドを使用して重複を削除する

Pythonリストメソッド.count()および.remove()を使用して、重複するアイテムを削除できます。

–構文list.count(value)を使用すると、 .count()メソッドはvaluelistに出現する回数を返します。 したがって、繰り返し項目に対応するカウントは1より大きくなります。

list.remove(value)は、リストから最初に出現する値を削除します。

上記を使用すると、次のコードが得られます。

 for sweet in sweets: # check if the count of sweet is > 1 (repeating item) if sweets.count(sweet) > 1: # if True, remove the first occurrence of sweet sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

.remove()メソッドは最初に出現する値のみを削除するため、2回以上出現するアイテムを削除するために使用することはできません。

  • 特定のアイテムが重複している場合(正確に2回発生する場合)、このメソッドは最初の発生を削除します。
  • 特定のアイテムがK回繰り返された場合、上記のコードを実行した後も、 K-1回の繰り返しが残ります。

しかし、一般的に、重複と言うときは、通常、すべての繰り返しを指します。

この場合を処理するには、上記のループを変更して、1つを除くすべての繰り返しを削除します。 特定のアイテムの数をチェックするためにif条件を使用する代わりに、 whileループを実行して、リスト内のすべてのアイテムの数が1になるまで重複を繰り返し削除することができます。

リストのsweetsには、「カップケーキ」が2回繰り返され、「キャンディー」が3回繰り返されるようになりました。

 sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

以下に示すように、 whileループを使用して繰り返しを削除できます。 whileループは、お菓子の甘いものの数が1より大きい限り実行され続けます。1回だけ残っている場合、条件sweets.count(sweet)> 1はFalseになり、ループは次の項目にスキップします。

 for sweet in sweets: # check if the count of sweet is > 1 (repeating item) while(sweets.count(sweet) > 1): # repeatedly remove the first occurrence of sweet until one occurrence remains. sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

ただし、ネストされたループの使用はあまり効率的ではない可能性があるため、大きなリストで作業している場合は、説明した他の手法の1つを使用することを検討できます。

これまでに、次のことを学びました。

  • 一意のアイテムのみを含む新しいリストを作成することにより、Pythonリストから重複アイテムを削除する方法
  • リストを適切に変更するための組み込みリストメソッド.count()および.remove()

繰り返しなしで値をすべて一意にする必要があるPython組み込みデータ構造がいくつかあります。 したがって、Pythonリストをこれらのデータ構造の1つにキャストして、重複を削除できます。 そして、それらをリストに戻します。 これを行う方法については、次のセクションで学習します。

Pythonリストをセットにキャストして重複を削除する

Pythonセットは、すべて一意の要素のコレクションです。 したがって、セットに存在するアイテムの数( len(<set-obj>で指定)は、存在する一意の要素の数に等しくなります。

構文set(iterable)を使用して、任意のPythoniterableをセットにキャストできます。

それでは、リストのお菓子をセットにキャストして、出力を調べてみましょう。

 set(sweets) # Output {'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

上記のコードセルの出力から、すべてのアイテムが1回だけ表示され、重複が削除されていることがわかります。

また、アイテムの順序は、元のリストのお菓子の順序と必ずしも同じではないことに注意してください。 これは、一意の要素のコレクションであることに加えて、Pythonセットオブジェクトが順序付けられていないコレクションであるためです。

リストをセットにキャストして重複を削除したので、次に示すように、再びリストに変換できます。

 unique_sweets = list(set(sweets)) print(unique_sweets) # Output ['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

重複を削除するための辞書キーとしてリストアイテムを使用する

Pythonディクショナリは、キーが値を一意に識別するキーと値のペアのコレクションです。

.fromkeys()メソッドを次の構文で使用してPythonディクショナリを作成できます: dict.fromkeys(keys, values) 。 ここで、 keysvaluesは、それぞれディクショナリのキーと値を含む反復可能オブジェクトです。

  • keys必須パラメーターであり、ディクショナリのキーに対応する任意のPythonイテラブルにすることができます。
  • valuesオプションのパラメーターです。 iterableの値を指定しない場合、デフォルト値のNoneが使用されます。

値を指定しない場合、 dict.fromkeys(sweets)は、値がデフォルト値であるNoneに設定されているPythonディクショナリを返します。 以下のコードセルはこれを説明しています。

 dict.fromkeys(sweets) # Output {'cake': None, 'candy': None, 'cheesecake': None, 'cupcake': None, 'lollipop': None}

前のセクションと同様に、以下に示すように、辞書をリストに再度変換できます。

 unique_sweets = list(dict.fromkeys(sweets)) print(unique_sweets) # Output ['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

上記の出力から、重複するアイテムがリストのsweetsから削除されていることがわかります。

まとめ

Pythonリストから重複アイテムや繰り返しを削除するために使用できるさまざまな方法の要約を次に示します。

  • Pythonリストメソッド.append()を使用して、繰り返されないアイテムを新しいリストに追加します。 新しいリストには、元のリストの各アイテムが1回だけ含まれ、すべての繰り返しが削除されます。 リスト内包表記を使用してこれを行うこともできます。
  • 組み込みの.count ()メソッドと.remove()メソッドを使用して、正確に2回発生するアイテムを削除します。 同じものをwhileループに配置して、すべての追加のオカレンスを削除できます。
  • Pythonリストをセットにキャストして、一意の要素のみを保持します。
  • ディクショナリの繰り返しキーがあってはならないため、 dict.fromkeys(list)を使用してリストから重複を削除します。

次に、Pythonプロジェクトをチェックして、練習して学習します。 または、Pythonリストでアイテムのインデックスを見つける方法を学びます。 幸せな学習!