Python比较字符串:忽略大小写, __eq__()
,差异, 内容, 不等于,相似度, 算法,时间复杂性,,列表
这篇文章总结了关于比较Python字符串的最常见的问题。
1. __eq__(
)方法
__eq__()
方法是Python中的一个特殊方法,用于比较两个对象是否相等。
当用==
操作符比较两个对象时,这个方法被自己调用。
Python的字符串比较操作也会调用这个方法,因为它们使用了==
操作符。
这意味着当你运行"Hello" == "hello"
时,Python实际上是在内部调用"Hello".__eq__("hello")
。
如果你像上面的代码那样运行它,你会得到两个字符串不同的结果
str1 = 'Hello'
str2 = 'hello'
print(str1 == str2) # output: False
这是因为定义在str
中的__eq__()
方法是区分大小写的,str
是Python中表示字符串的内置类。
因此,我们可以说,任何使用==
操作符的Python内置类都在其类中定义了__eq__()
方法。
我们可以通过覆盖任何类的__eq__()
方法来定制==
操作符的行为。
如果这个方法不存在,Python默认为比较两个对象的内存地址。
下面的例子定义了一个新的字符串类CaseInsensitiveStr
,执行不区分大小写的比较。
注意方法__eq__()
是如何定义的。
class CaseInsensitiveStr:
def __init__(self, str_):
self.str_ = str_.lower()
def __eq__(self, other):
if isinstance(other, CaseInsensitiveStr):
return self.str_ == other.str_
elif isinstance(other, str):
return self.str_ == other.lower()
return False
str1 = CaseInsensitiveStr('Hello')
str2 = CaseInsensitiveStr('hello')
print(str1 == str2) # output: True
2. 使用不等式(>
,<
)
在Python中比较字符串时,不等式运算符可以用于两个目的
- 表明词法顺序
- 表示一种包含关系
2.1. 用于表示词法顺序的不等式运算符
让我们从第一个开始: Python基于ASCII值进行字母数字比较,基于Unicode值(主要是utf-8
)进行韩文字符比较。
当你像这样比较字母a
和b
时,你实际上是在比较这两个字符的ASCII值。
ord()
函数是一个内置函数,可以返回给定字符的Unicode码位(包括ASCII码),所以你可以得到任何字符的数值。
print("a" == "b") # this comparison is actually
print(ord("a") == ord("a")) # This comparison is true.
根据同样的原则,当你使用不等式运算符如>
和<
来比较字符串时,你是在比较Unicode编码点的值。
这些值对于字母和字母数字字符都是按字母比例排列的。z
比a
大,小写字母比大写字母大。
print("a" < "z") # Output: True
print("A" < "a") # Output: True
2.2. 表示包容关系的不等式运算符
第二个用途是用于字符串之间的包含关系。
当 Python 比较两个或多个字符的字符串时,它会一个一个地比较,从最早的元素开始。 如果一个字符串是另一个字符串的子串,在某些时候,你将不得不比较字符和空格。 在这一点上,较长的字符串被确定为较大。
让我们在代码中看到这一点
print("trees" > "tree") Output: True
因为"tree"
是"trees"
的子串,所以它将总是被解析为较小的值。
我提到这一点并不是说你应该在字符串包含关系中使用不等式运算符、
而是为了说明 Python 的字符串比较是如何工作的。
我们有强大的关键字in
来确定包含关系。
3. Python的字符串比较算法和时间复杂度
Python的字符串比较算法是很直观的。 要比较两个字符串,Python会比较同一索引的前两个字符。
这导致了当需要最大数量的操作时,时间复杂度为O(n)
,例如"hello" == "hellu"
。
4.比较两个字符串时如何忽略大小写
正如在第1节中提到的,Python的str
类实现了大小写敏感的方法__eq__()
。
如果你想对两个字符串进行大小写不敏感的比较,你可以使用str
类的upper()
或lower()
方法。
顾名思义,upper()
方法将一个给定字符串中的所有字符大写、
lower()
方法返回一个新的字符串,将给定字符串中的字符转换为小写。
正因为如此,我们很容易忽略大小写并进行比较。
让我们在一个代码例子中看到这一点
lower_case = "happy"
mixed_case = "HaPPy"
print(lower_case == mixed_case) # output: False
print(lower_case.upper() == mixed_case.upper()) # output: True
这就是你如何得到不区分大小写的Python字符串比较结果。
5. 字符串-列表比较
Python字符串和列表是不同的数据类型,所以直接比较它们总是会返回False
。
print(["a", "b", "c"] == "abc") # Output: False
为了比较两个数据类型的内容,我们需要匹配数据类型。要做到这一点,我们可以使用以下两种方法。
5.1. list()函数将一个字符串转换成一个列表
第一个方法是将一个字符串转换为一个列表。Python的list()
函数是一个简单的函数,可以将许多不同的数据类型转换为列表。
像这样使用它
print(list("abc")) # Output: ["a", "b", "c"]
print(["a", "b", "c"] == list("abc")) # output: True
由于数据类型相同,我们比较了两个列表的元素,并返回一个True
值。
5.2. join() 方法将列表转换为字符串
另外,我们也可以将列表转换为字符串,然后再进行比较。
要做到这一点,请使用join()
方法。这个方法将列表中的所有元素合并为一个字符串。
print("".join(["a", "b", "c"])) # output: "abc"
print("".join(["a", "b", "c"]) == "abc") # Output: True
现在我们有相同的字符串类型,我们可以比较内容。
6. 总结
我们已经涵盖了关于在Python中比较字符串的5个最常见的问题,我希望这篇文章能解开你的一些疑问。
