我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
当前回答
通常(至少在oop中),您可以按照您想要的方式来塑造对象。USERNAMES中的name不区分大小写,因此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 self.names中的n)并将其存储在类中,等等……
其他回答
本教程中的例子:
list1 = ["Apple", "Lenovo", "HP", "Samsung", "ASUS"]
s = "lenovo"
s_lower = s.lower()
res = s_lower in (string.lower() for string in list1)
print(res)
Str.casefold建议用于不区分大小写的字符串匹配。@nmichaels的解决方案可以简单地进行调整。
使用:
if 'MICHAEL89'.casefold() in (name.casefold() for name in USERNAMES):
Or:
if 'MICHAEL89'.casefold() in map(str.casefold, USERNAMES):
根据文档:
大小写折叠类似于小写,但更激进,因为它 用于删除字符串中的所有大小写区别。例如, 德语小写字母“ß”相当于“ss”。因为它是 已经小写了,lower()不会对'ß'做任何事情;casefold () 将其转换为“ss”。
你可以这样做
matcher = re.compile('MICHAEL89', re.IGNORECASE)
filter(matcher.match, USERNAMES)
更新:玩了一点,我认为你可以得到一个更好的短路类型的方法使用
matcher = re.compile('MICHAEL89', re.IGNORECASE)
if any( ifilter( matcher.match, USERNAMES ) ):
#your code here
filter函数来自itertools,它是Python中我最喜欢的模块之一。它比生成器快,但只在调用时创建列表的下一项。
我认为你需要写一些额外的代码。例如:
if 'MICHAEL89' in map(lambda name: name.upper(), USERNAMES):
...
在本例中,我们将形成一个新列表,其中USERNAMES中的所有条目都转换为大写,然后与这个新列表进行比较。
更新
正如@viraptor所说,使用生成器而不是map更好。请看@内森的回答。
通常(至少在oop中),您可以按照您想要的方式来塑造对象。USERNAMES中的name不区分大小写,因此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 self.names中的n)并将其存储在类中,等等……