【Python】文字列から重複する単語をすべて削除する方法
Pythonで文字列に含まれる重複した単語をすべて削除するには、まず文字列をスペースで区切って各単語をリストに格納します。そのうえで、いくつかの方法で重複を取り除くことができます。
ここでは、すべての単語を小文字に変換してからソートし、重複を除外して一意な単語のみを抽出する方法を紹介します。
ソートとループを使った方法
次のコードでは、split()メソッドで文字列を単語ごとに分割し、lower()で小文字に統一したあと、リストを走査して重複しない単語だけを新しいリストに追加しています。
sent = "Hi my name is John Doe John Doe is my name"
# 文字列をスペースで分割して各単語を取得
words = sent.split(" ")
# すべての単語を小文字に変換
words = [w.lower() for w in words]
# 単語をアルファベット順にソート
words.sort()
# 重複しない単語だけを抽出
unique = []
for word in words:
if word not in unique:
unique.append(word)
print(unique)
出力結果
実行すると、次のような出力が得られます。
['doe', 'hi', 'john', 'is', 'my', 'name']
大文字・小文字の違いを無視して比較しているため、「John」と「john」は同じ単語として扱われ、それぞれの一意な単語がアルファベット順に出力されます。
set()を使ったよりシンプルな方法
コードをもっと簡潔にしたい場合は、set()を使えば数行で重複を削除できます。sorted()と組み合わせれば、結果をソート済みのリストとして受け取ることも可能です。
sent = "Hi my name is John Doe John Doe is my name"
words = sent.split(" ")
unique = sorted(set(w.lower() for w in words))
print(unique) # ['doe', 'hi', 'john', 'is', 'my', 'name']
元の出現順序を保ったまま重複を削除する方法
単語が最初に現れた順序を維持したい場合は、dict.fromkeys()が便利です。Python 3.7以降の辞書は挿入順序を保持するため、このテクニックで順序を守りながら重複だけを取り除けます。
sent = "Hi my name is John Doe John Doe is my name"
words = sent.split(" ")
unique = list(dict.fromkeys(w.lower() for w in words))
print(unique) # ['hi', 'my', 'name', 'is', 'john', 'doe']
まとめ
- 文字列の重複削除は、まずsplit()で単語ごとに分割するところから始めます。
- 大文字と小文字を同一視したい場合は、lower()で事前に正規化しておきましょう。
- シンプルさを重視するならset()、出現順序を保持したいならdict.fromkeys()がおすすめです。
-
指定された文字列のすべての順列を出力するPythonプログラム
本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +
-
Pythonで文字列から特殊文字・句読点・空白をすべて削除する方法
Pythonで文字列に含まれる特殊文字、句読点、空白などをまとめて削除したい場合、いくつかの簡単な方法があります。ここでは代表的な2つのアプローチを紹介します。 方法1:内包表記とisalnum()を使う 文字列を1文字ずつ反復処理し、isalnum()メソッドで英数字のみを抽出する方法です。isalnum()は、その文字がアルファベットまたは数字であればTrueを返すため、それ以外の記号や空白は自動的に除外されます。 >>> string = Hello $#! People Whitespace 7331 >>> .join(e fo