Python リストから句読点を削除する
-
Python の
string.punctuation
定数 -
Python で
for
ループを使用してリストから句読点を削除する - Python でリスト内包表記を使用してリストから句読点を削除する
-
Python の
str.translate()
関数を使用してリストから句読点を削除する
![Python リストから句読点を削除する](/img/Python/feature-image---python-remove-punctuation-from-list.webp)
このチュートリアルでは、文字列定数 string.punctuation
を紹介し、Python で文字列のリストから句読点を削除するいくつかの方法について説明します。
Python の string.punctuation
定数
string.punctuation
は、Python で事前に初期化された文字列であり、すべての句読点が含まれています。この文字列を使用するには、文字列
モジュールをインポートする必要があります。string.punctuation
定数を次のコーディング例に示します。
import string
print(string.punctuation)
出力:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
string
モジュールをインポートし、string.punctuation
定数の値を表示しました。出力には、英語で可能なすべての句読点が表示されます。
Python で for
ループを使用してリストから句読点を削除する
Python の for
ループで string.punctuation
を使用することにより、文字列のリストからすべての句読点を削除できます。次のコード例は、この現象を示しています。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
new_words = []
for word in words:
for letter in word:
if letter in string.punctuation:
word = word.replace(letter, "")
new_words.append(word)
print(new_words)
出力:
['hello', 'Hi', 'bye bye', 'good bye', '']
句読点を含む文字列 words
のリストを初期化しました。次に、words
リストの各文字列の各文字を反復処理するネストされたループを作成しました。外側の for
ループはリスト内の各文字列を反復処理し、内側の for
ループはその文字列の各文字
を反復処理します。次に、その letter
が if
ステートメントを使用して string.punctuation
定数内にあるかどうかを確認しました。文字が string.punctuation
定数内にある場合は、空の文字列に置き換えて削除します。文字列からすべての句読点を削除した後、その文字列を new_words
リストに追加します。最後に、new_words
リストを出力しました。
この実装の唯一の問題は、空の文字列が最終リスト内に残ることを許可することです。要件によっては、ループ内に追加のチェックを配置することで、元のリストから空の文字列を削除することもできます。次のコードスニペットは、リストから空の文字列を削除する方法も示しています。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
new_words = []
for word in words:
if word == "":
words.remove(word)
else:
for letter in word:
if letter in string.punctuation:
word = word.replace(letter, "")
new_words.append(word)
print(new_words)
出力:
['hello', 'Hi', 'bye bye', 'good bye']
今回は、コードによって元の文字列から空の文字列も削除されました。
Python でリスト内包表記を使用してリストから句読点を削除する
以前のアプローチの唯一の問題は、文字列のリストから句読点を削除するという単純なタスクに必要なコードが多すぎることです。リスト内包表記は、リスト要素に対してさまざまな計算操作を実行する方法です。リスト内包表記内で for
ループと if
ステートメントを使用できます。リスト内包表記を使用する主な利点は、必要なコードが少なく、一般に単純な for
ループよりも高速であることです。string.punctuation
文字列定数でリスト内包表記を使用して、Python の文字列のリストから句読点を削除できます。次のコード例は、リスト内包表記を使用してリストから句読点を削除する方法を示しています。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
words = [
"".join(letter for letter in word if letter not in string.punctuation)
for word in words
]
print(words)
出力:
['hello', 'Hi', 'bye bye', 'good bye', '']
正直に言うと、上記のコードを理解するのは少し難しいですが、それほど複雑ではありません。ネストされたリスト内包表記を使用しているだけです。コードの内部は、単一の単語内の各文字が string.punctuation
定数に存在するかどうかをチェックし、string.punctuation
にない文字のみを返します。コードのこの部分を囲む str.join()
関数は、返されたすべての文字を空の文字列で結合し、句読点のない完全な単語を提供します。外側の部分は、words
リスト内の各単語に対してこの内側のリスト内包を実行します。外側のリスト内包によって返された単語を words
リストに保存します。最後に、words
リストのすべての要素を表示します。
リスト内包表記を使用するもう 1つの利点は、RAM のスペースを節約できることです。つまり、コード全体で、結果を保存するための新しいリストを作成する代わりに、元のリストを更新しました。外側のリスト内包に余分な if
ステートメントを配置することで、元のリストから空の文字列を削除することもできます。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
words = [
"".join(letter for letter in word if letter not in string.punctuation)
for word in words
if word
]
print(words)
出力:
['hello', 'Hi', 'bye bye', 'good bye']
今回は、単語に要素がない場合、外側のリスト内包は内側のリスト内包を実行しません。このアプローチでは、結果の文字列リストに空の文字列は含まれません。
Python の str.translate()
関数を使用してリストから句読点を削除する
以前の実装は、必要なコードが少なく、従来のループを使用するよりも高速であるため、優れていますが、より優れている可能性があります。コードは少ないですが、コードは少し複雑です。Python で文字列のリストから句読点を削除する最も速くて効率的な方法は、str.translate()
関数です。リスト内包表記よりも必要なコードが少なく、はるかに高速です。str.translate()
関数は、変換テーブルに従って文字列内の各文字をマップします。この場合、string.punctuation
内のすべての文字を空の文字列にマップします。次のコード例は、str.translate()
関数を使用してリストから句読点を削除する方法を示しています。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
words = [word.translate(string.punctuation) for word in words]
print(words)
出力:
["hell'o", 'Hi,', 'bye bye', 'good bye', '']
string.punctuation
定数で str.translate()
関数を使用し、リスト内包表記を使用して、words
リストから句読点を削除しました。word.translate(string.punctuation)
は、string.punctuation
定数の各文字を空の文字列にマップし、リスト内包表記は、words
リストの各文字列に対してこのコードを実行し、結果を返します。返されたすべての文字列を words
リストに割り当て、出力を表示します。
出力には、結果に空の文字列が表示されます。この空の文字列をさらに削除するには、リスト内包内に追加の条件を配置する必要があります。
import string
words = ["hell'o", "Hi,", "bye bye", "good bye", ""]
words = [word.translate(string.punctuation) for word in words if word]
print(words)
出力:
["hell'o", 'Hi,', 'bye bye', 'good bye']
前の結果から空の文字列を削除しましたが、もう 1つ条件があります。
string.punctuation
は、可能なすべての句読点を含む事前定義された定数文字列です。複数のメソッドがこの文字列定数を使用して文字列のリストから句読点を削除しますが、最も簡単に記述でき、最も速く、最も効率的な実装は、リスト内包表記で str.translate()
関数を使用することです。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn関連記事 - Python List
- Python でリストから要素の出現をすべて削除する
- Python で辞書をリストに変換する
- Python でリストから重複を削除する
- Python でリストの平均を取得する方法
- リストメソッドの追加と拡張の違いは何ですか
- Python でリストを文字列に変換する方法