我喜欢用这样的表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES
是一个列表。
有没有办法匹配不区分大小写的项目,或者我需要使用自定义方法?我只是想知道是否需要为此编写额外的代码。
发布于 2010-09-02 21:59:08
username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
...
或者:
if username.upper() in map(str.upper, USERNAMES):
...
或者,是的,您可以创建自定义方法。
发布于 2010-09-02 22:45:08
我会做一个包装器,这样你就可以成为非侵入性的。最低限度,例如:
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
的警告,等等)。
发布于 2010-09-02 23:31:05
通常(至少在oop中),你可以按照你想要的方式塑造你的对象。name in USERNAMES
不区分大小写,因此USERNAMES
需要更改:
class NameList(object):
def __init__(self, names):
self.names = names
def __contains__(self, name): # implements `in`
return name.lower() in (n.lower() for n in self.names)
def add(self, name):
self.names.append(name)
# now this works
usernames = NameList(USERNAMES)
print someone in usernames
这样做的好处是,它为许多改进铺平了道路,而不必更改类外部的任何代码。例如,您可以将self.names
更改为一个更快的查找集,或者只计算一次(n.lower() for n in self.names)
并将其存储在类中,依此类推...
https://stackoverflow.com/questions/3627784
复制相似问题