关于字符串操作的 Python 程序

本教程将引导你编写Python程序,解决一些常见的字符串处理难题。

你将学习如何使用Python来判断字符串是否为回文,是否为字谜,以及如何检查字符串是否符合标题大小写的格式要求。

Python字符串:简要回顾

在Python中,字符串是一种非常实用的内置数据类型,用于存储一系列字符。

Python字符串的索引:如同所有的Python可迭代对象,字符串的索引也是从零开始的。因此,一个长度为N的字符串,其有效的索引值范围是从0到N-1。

此外,Python还支持使用负索引从字符串的末尾开始访问元素。例如,-1代表字符串的最后一个字符,-2代表倒数第二个字符,以此类推。

Python字符串的不可变性:需要注意的是,Python中的字符串是不可变的,这意味着你无法直接修改它们。不过,你可以调用各种字符串方法来获取修改后的字符串副本,以达到所需的结果。

在简要回顾了Python字符串的基础知识之后,让我们开始解决一些简单而有趣的问题。

让我们开始吧!

判断Python字符串是否为回文

问题:给定一个Python字符串,请判断它是否为回文。

如果该字符串是回文,则返回True;否则,返回False。

我们遇到的第一个问题是判断给定的字符串是否是回文。

回文是指从左到右读取与从右到左读取都相同的字符串。例如:racecar、refer、level、madam、radar等都是回文。

以下是解决这个问题的步骤:

  • 首先,获取字符串的反向副本,并将其存储在另一个变量中(如果需要)。
  • 然后,比较原始字符串和反转后的字符串的值。
  • 如果两个字符串相等,则说明该字符串是回文,此时返回True并结束程序。
  • 如果原始字符串和反转后的字符串不相等,则说明该字符串不是回文,此时返回False。

关键操作在于获取字符串的反向副本。在Python中,有多种不同的方法可以实现这一目标。

这里我们将介绍两种常见的方法:

  • 使用字符串切片。
  • 使用reversed()函数和join()方法。

如何使用切片反转Python字符串

语法[start: stop: step]会返回字符串的一个切片,切片从索引start开始,到索引stop结束(不包括stop),步长为step。

  • 如果省略start,则切片从字符串的开头开始。
  • 如果不指定停止索引stop,则切片会一直延伸到字符串的末尾。
  • step可以使用负值,此时切片会从字符串的末尾开始,反向获取。

所以,表达式[::-1]可以返回字符串的反向副本。

下面的代码块定义了一个名为is_palindrome()的函数。

该函数接受一个字符串作为参数,并根据该字符串是否为回文返回True或False。

这里我们使用了字符串切片的方法来获取字符串的反向副本。

def is_palindrome(this_str):
  rev_str = this_str[::-1]
  if (this_str == rev_str):
    return True
  else:
    return False

▶️ 现在我们已经定义了这个函数,可以传入任何有效的字符串作为参数来调用它。

is_palindrome("racecar")
True

在上面的例子中,”racecar”是一个回文。因此,is_palindrome()函数如预期地返回了True。

现在,尝试用一个非回文字符串(如”river”)来调用该函数。

is_palindrome("river")
False

可以看到,函数返回了False,结果是正确的。✅

如何使用reversed()和join()反转Python字符串

在Python中,你还可以使用join()方法和reversed()函数来反转字符串。

  • reversed()函数会返回一个反向迭代器,该迭代器按照字符在字符串中的反向顺序进行迭代。
  • 然后可以使用join()方法将这些字符按照相反的顺序连接起来。

使用上述方法,可以重新编写is_palindrome()函数,如下面的代码块所示。

def is_palindrome(this_str):
  rev_str="".join(reversed(this_str))
  if (this_str == rev_str):
    return True
  else:
    return False

你还可以在列表推导式中使用is_palindrome()函数,从一个较长的字符串列表中筛选出所有回文字符串。

str_list = ["refer","blue","level","12321","dragon"]

palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['refer', 'level', '12321']

以上代码的执行步骤如下:

  • 遍历str_list中的每个字符串,并对每个字符串调用is_palindrome()函数。
  • 如果is_palindrome()函数返回True,则将该字符串添加到palindromes列表中。

正如你在上面的输出中看到的,palindromes列表包含了str_list中所有回文字符串。

判断两个Python字符串是否为字谜

在面试中你可能会遇到的另一个常见问题是,判断一对字符串str1str2是否是字谜。

如果两个字符串包含完全相同的字符,并且字符的数量也完全一致,那么这两个字符串就被认为是字谜。这意味着你可以通过重新排列其中一个字符串的字符来得到另一个字符串。

字谜的例子有:state-taste、save-vase、bow-below等。

如何在Python中使用Counter对象判断字谜

一种简单直接的方法是统计两个字符串中每个字符出现的次数,然后判断两个字符串的字符计数是否相等。

使用itertools模块中的Counter对象可以更容易地完成这项任务。Counter对象会返回一个Python字典:字符作为键,对应的计数作为值。

考虑以下字符串”save”和”vase”。

str1 = "save"
str2 = "vase"

这里,c1c2Counter对象,分别记录了字符串str1str2中字符出现的次数。

from collections import Counter
c1 = Counter(str1)
c2 = Counter(str2)
print(c1)
print(c2)
c1 == c2

# Output
Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1})
Counter({'v': 1, 'a': 1, 's': 1, 'e': 1})
True

c1 == c2返回True,因为str1str2是字谜。

基于这个逻辑,现在我们可以定义一个名为are_anagrams()的函数,该函数接受两个参数word1word2。在函数体中,我们判断Counter(word1)是否等于Counter(word2)

def are_anagrams(word1, word2):
  if Counter(word1) ==  Counter(word2):
    return True
  else:
    return False

▶️ 为了验证,我们使用str1str2作为参数来调用are_anagrams()函数。由于str1str2是字谜(”save”和”vase”),所以该函数返回True,结果正确。

are_anagrams(str1, str2)
True

如何使用排序后的字符串副本判断字谜

还有另一种方法可以判断两个字符串是否是字谜。

如果两个字符串是字谜,那么它们的排序副本是相等的。

因此,我们可以重新编写are_anagrams()函数,来判断str1的排序版本是否与str2的排序版本相同。如果它们相等,那么这两个字符串就是字谜;否则,它们就不是。

使用上述方法来判断排序副本的相等性,我们可以将are_anagrams()函数重写如下。

def are_anagrams(word1, word2):
  if sorted(word1) ==  sorted(word2):
    return True
  else:
    return False

现在让我们调用几次这个函数。

  • 字符串”elbow”和”below”是字谜,所以函数are_anagrams()返回True。
  • 而字符串”state”和”tasted”不是字谜,因此函数返回False。
are_anagrams("below","elbow")
True

are_anagrams("state","tasted")
False

判断Python字符串是否为标题大小写

这是本教程中的最后一个问题。

问题:给定一个字符串,代表一个人的姓名,包括名字和姓氏。

你需要判断名字和姓氏的首字母是否都为大写。

这种将每个单词的首字母大写的方式被称为标题大小写。

因此,你需要检查给定的姓名是否符合标题大小写的格式:

1. 如果是,则输出一条消息,说明该字符串已经是标题大小写的格式。

2. 否则,返回一个字符串副本,该副本已转换为标题大小写的格式。

  • Python内置了一个字符串方法istitle(),用于判断字符串是否符合标题大小写的格式。

.istitle()方法如果字符串是以标题大小写格式化的,则返回True,否则返回False。

  • Python的字符串方法title()会返回一个字符串的副本,该副本已经转换为标题大小写的格式。

现在你可以使用这两种方法来解决这个问题。

定义一个名为check_titlecase()的函数,该函数接受一个名为name的参数。

  • 你可以调用输入字符串的istitle()方法,来判断该字符串是否为标题大小写格式。
  • 如果istitle()方法返回True,则打印该字符串已经是标题大小写格式的消息。
  • 否则,你可以调用title()方法,并返回该字符串的标题大小写副本。

以下代码块显示了check_titlecase()函数的定义。

def check_titlecase(name):
  if name.istitle():
    print(f"'{name}' is already formatted in title case.")
  else:
    return name.title()

现在让我们使用不同的参数来调用check_titlecase()方法。

check_titlecase("jane smith")

# Output
Jane Smith

在上面的输出中,你可以看到字符串”Jane Smith”已经被转换为了标题大小写格式。

▶️ 让我们再看一个例子。

check_titlecase("agatha Christie")

# Output
Agatha Christie

这一次,让我们使用一个已经是标题大小写的字符串来调用该函数。

check_titlecase("Grace Hopper")

# Output
'Grace Hopper' is already formatted in title case.

我们收到消息,提示该字符串已经是以标题大小写格式化的,这表明该函数工作正常。

总结👩‍🏫

现在让我们总结一下到目前为止我们讨论过的问题。

  • 要判断字符串是否为回文,你需要判断该字符串与其反转版本是否相等。你可以使用字符串切片或内置方法来反转字符串。
  • 要判断两个字符串是否为字谜,你需要判断它们的排序副本是否相等。要对字符串进行排序,请使用内置的sorted()函数。
  • 要验证姓名是否为标题大小写格式,可以使用.istitle()方法进行检查,并使用.title()方法获取该字符串的标题大小写副本。

希望你喜欢这篇关于Python字符串的教程。下一步,你可以学习如何在Python中使用列表推导式,或者了解Python中的不等于运算符。

祝你学习愉快,编码快乐!🎉