忽略大小写进行字符串比较

9
如果有两个变量a和b,它们可以是整数、浮点数或字符串。
如果它们相等(在字符串的情况下忽略大小写),我希望返回True
尽可能使用Pythonic方式实现。

4
你尝试过什么,可以和我们分享一下吗? - Levon
在比较时,a和b是否为相同类型? - underbar
可能是如何在Python中进行不区分大小写的字符串比较?的重复问题。 - Anderson Green
3个回答

21

这是我能想到的最具有Python风格的代码。与其请求许可,不如先行动后寻求原谅:

>>> def iequal(a, b):
...    try:
...       return a.upper() == b.upper()
...    except AttributeError:
...       return a == b
... 
>>> 
>>> iequal(2, 2)
True
>>> iequal(4, 2)
False
>>> iequal("joe", "Joe")
True
>>> iequal("joe", "Joel")
False

抱歉,我想使用basestring。 - jterrace
当我看到 try/except 时,我立刻按下了 (+1)。 - mgilson
@sr2222 -- 你可以将任何对象转换为字符串。你的建议永远不会引发异常。此外,iequal(1.0,1)将返回False,这似乎有点奇怪... - mgilson
首先,没有__str__的对象或者故意重写为返回异常的__str__无法转换为字符串。其次,@mgilson,是的,一个比较两个字符串而不考虑大小写的方法不应该对两个具有不同字符串表示的东西(除了大小写)评估为True。这是功能对称的基本问题。第三,由于调用upper()并不强制将对象转换为字符串,因此您可能会有两个字符串表示相等的对象,但此函数将返回False - Silas Ray
@sr2222 对象有一个默认的 __str__ 方法: class Foo(): pass; x = Foo(); print str(x) 的输出结果为 <__main__.Foo object at 0x108dcec90> - jterrace
显示剩余6条评论

7
这样怎么样,不使用isinstance(被反对):
def equal(a, b):
    try:
        return a.lower() == b.lower()
    except AttributeError:
        return a == b

2
Python没有catch语句,你要用except。但最好不要使用裸的except语句。 - mgilson
该死,我永远不够快。当我到这里时,已经有一个使用isinstance的答案了。 - DrGodCarl
是的,我的错。最近主要在做 Objective-C。 - DrGodCarl

2
>>> def equals_ignore_case(a,b):
...   return a.upper() == b.upper()
...
>>> equals_ignore_case("hello","Hello")
True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接