不区分大小写的'in'

问题描述 投票:142回答:9

我喜欢使用表达式

if 'MICHAEL89' in USERNAMES:
    ...

其中USERNAMES是列表。


是否有任何方法可以区分大小写不敏感的项目,还是需要使用自定义方法?只想知道是否需要为此编写额外的代码。

python string list case-insensitive
9个回答
166
投票
username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
    ...

或者:

if username.upper() in map(str.upper, USERNAMES):
    ...

或者,是的,您可以创建自定义方法。


20
投票

我会做一个包装器,因此您可以是非侵入性的。最少,例如...:

class CaseInsensitively(object):
    def __init__(self, s):
        self.__s = s.lower()
    def __hash__(self):
        return hash(self.__s)
    def __eq__(self, other):
        # ensure proper comparison between instances of this class
        try:
           other = other.__s
        except (TypeError, AttributeError):
          try:
             other = other.lower()
          except:
             pass
        return self.__s == other

现在,if CaseInsensitively('MICHAEL89') in whatever:应该按照要求进行操作(无论右侧是列表,字典还是集合)。 (可能需要付出更多的努力才能获得相似的字符串包含结果,在某些情况下避免涉及unicode的警告,等等。)


11
投票

通常(至少在oop中),将对象定型为所需的行为。 name in USERNAMES不区分大小写,因此USERNAMES需要更改:


6
投票

我认为您必须编写一些额外的代码。例如:


6
投票

str.casefold对于不区分大小写的字符串推荐使用。 @nmichaels's solution可以轻松修改。


6
投票

这里是一种方式:


5
投票

您可以做


0
投票

我的5(错误的)美分


0
投票

我需要一个字典而不是列表,Jochen解决方案在这种情况下是最优雅的,所以我对其进行了修改:

© www.soinside.com 2019 - 2024. All rights reserved.