3 回答

TA贡献1796条经验 获得超4个赞
if 'MICHAEL89' in (name.upper() for name in USERNAMES):
...
或者:
if 'MICHAEL89' in map(str.upper, USERNAMES):
...
或者,可以的,您可以定制方法。

TA贡献1850条经验 获得超11个赞
我会做一个包装纸,这样您就可以做到无创。至少,例如:
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等等)。

TA贡献1911条经验 获得超7个赞
通常(至少在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)仅计算一次并将其存储在类中,依此类推...
添加回答
举报