从 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 模块。string.punctuation 常量显示在以下编码示例中。

import string

print(string.punctuation)

输出:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

我们导入了 string 模块并显示了 string.punctuation 常量的值。输出显示了所有可能的英语标点符号。

在 Python 中使用 for 循环从列表中删除标点符号

我们可以通过在 Python 中使用 string.punctuationfor 循环从字符串列表中删除所有标点符号。下面的代码示例演示了这种现象。

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 语句检查该 letter 是否在 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 列表的所有元素。

使用列表推导式的另一个优点是我们节省了 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']

我们从前一个结果中删除了空字符串,只增加了一个条件。

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