Pythonでリストから重複して出現する要素を削除し、一意な要素だけを抽出する方法
はじめに
数値のリスト nums が与えられたとき、リスト内に複数回出現する要素を削除し、一度だけ出現する要素だけを、元のリストでの出現順序を保ったまま残すことを考えます。
例えば、入力が nums = [2, 4, 6, 1, 4, 6, 9] の場合、出力は [2, 1, 9] となります。これは、2・1・9 の3つの要素がそれぞれ一度しか登場しておらず、4 と 6 は2回ずつ出現しているため除外されるからです。
解決のアプローチ
この問題は、各要素の出現回数を記録する辞書(ハッシュマップ)を使うことで効率的に解決できます。手順は以下の通りです。
- 出現回数をカウントするための空の辞書を作成する
- リスト
numsの各要素iについて以下を繰り返すiがまだ辞書に存在しない場合は、dict[i] = 0として初期化するdict[i]に 1 を加算して出現回数を更新する
- 最後に、
dict[e] == 1(一度しか出現しない)となるすべての要素eを含むリストを返す
Python 3.7 以降の辞書は挿入順序を保持するため、この方法では元のリストの順序も自然に維持されます。計算量は O(n) で、非常に効率的です。
実装例
class Solution:
def solve(self, nums):
count = {}
for i in nums:
if i not in count:
count[i] = 0
count[i] += 1
return [k for k, v in count.items() if v == 1]
ob = Solution()
nums = [2, 4, 6, 1, 4, 6, 9]
print(ob.solve(nums))
入力
[2, 4, 6, 1, 4, 6, 9]
出力
[2, 1, 9]
より簡潔な書き方:collections.Counter を使う
標準ライブラリの collections.Counter を使えば、カウント処理をさらにシンプルに記述できます。
from collections import Counter
def solve(nums):
c = Counter(nums)
return [x for x in nums if c[x] == 1]
nums = [2, 4, 6, 1, 4, 6, 9]
print(solve(nums)) # [2, 1, 9]
こちらの方法では元のリストを直接走査するため、順序の維持がより明確になり、可読性も向上します。
まとめ
リストから重複して出現する要素を削除したい場合は、辞書や Counter で出現回数を数え、回数が 1 の要素だけを抽出するのが定番のアプローチです。どちらの方法も O(n) の計算量で動作するため、大量のデータに対しても高速に処理できます。
-
Pythonでリストから重複要素を削除する方法を徹底解説
重複した要素を含むリストが与えられたとき、重複を取り除いた新しいリストを作成するのが本記事のテーマです。初心者の方にも理解しやすいよう、基本的なアルゴリズムの手順から実際のコードまで順を追って解説していきます。 実行例 入力::[2,3,4,3,4,6,78,90] 出力::[2,3,4,6,78,90] アルゴリズム 重複要素を削除するための基本的な手順は以下の通りです。 元となるリストを作成する。 空の新しいリストを用意する。 元のリストの各要素を先頭から順番に走査する。 その要素が新しいリストにまだ存在しないかどうかを判定する。 存在しない場合のみ、新しいリストへ要素を追加する。
-
Pythonで3Dリスト(3次元配列)を作成する方法【サンプルコード付き】
3Dリストとは、いわゆる3次元配列のことです。本記事では、Pythonで3Dリストを作成し、その内容を整形して出力するプログラムを解説します。ここでは例として、文字列「*」を初期値とする3×2×2の3次元リストを生成しますが、仕組みを理解すれば整数など任意の要素を持つ配列にも簡単に応用できます。 3Dリストのイメージ 3次元リストは、リストの中にリスト、さらにその中にリストが入った多段構造のデータです。たとえば、3×3×2の3Dリストは次のように表現できます。 [[1,1,1],[2,2,2],[3,3,3]], [[4,4,4],[5,5,5],[6,6,6]] アルゴリズム ステップ1: