Python リストから句読点を削除する

Muhammad Maisam Abbas 2023年1月30日
  1. Python の string.punctuation 定数
  2. Python で for ループを使用してリストから句読点を削除する
  3. Python でリスト内包表記を使用してリストから句読点を削除する
  4. Python の str.translate() 関数を使用してリストから句読点を削除する
Python リストから句読点を削除する

このチュートリアルでは、文字列定数 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 ループはその文字列の各文字を反復処理します。次に、その letterif ステートメントを使用して 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() 関数を使用することです。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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 String