我喜欢使用表达式
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES
是列表。
是否有任何方法可以区分大小写不敏感的项目,还是需要使用自定义方法?只想知道是否需要为此编写额外的代码。
username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
...
或者:
if username.upper() in map(str.upper, USERNAMES):
...
或者,是的,您可以创建自定义方法。
我会做一个包装器,因此您可以是非侵入性的。最少,例如...:
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
的警告,等等。)
通常(至少在oop中),将对象定型为所需的行为。 name in USERNAMES
不区分大小写,因此USERNAMES
需要更改:
我认为您必须编写一些额外的代码。例如:
str.casefold
对于不区分大小写的字符串推荐使用。 @nmichaels's solution可以轻松修改。
这里是一种方式:
您可以做
我的5(错误的)美分
我需要一个字典而不是列表,Jochen解决方案在这种情况下是最优雅的,所以我对其进行了修改: