我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
当前回答
本教程中的例子:
list1 = ["Apple", "Lenovo", "HP", "Samsung", "ASUS"]
s = "lenovo"
s_lower = s.lower()
res = s_lower in (string.lower() for string in list1)
print(res)
其他回答
我的5美分(错误的)
"".join([' a']).lower()
更新
哎呦,完全同意@jpp,我会把它作为一个糟糕做法的例子:(
你可以这样做
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中我最喜欢的模块之一。它比生成器快,但只在调用时创建列表的下一项。
我需要这个字典而不是列表,杨晨的解决方案是最优雅的情况下,所以我修改了一点:
class CaseInsensitiveDict(dict):
''' requests special dicts are case insensitive when using the in operator,
this implements a similar behaviour'''
def __contains__(self, name): # implements `in`
return name.casefold() in (n.casefold() for n in self.keys())
现在你可以像这样转换字典USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)和使用if 'MICHAEL89'在USERNAMESDICT:
为了把它写在一行里,我是这样做的:
if any(([True if 'MICHAEL89' in username.upper() else False for username in USERNAMES])):
print('username exists in list')
不过我并没有在时间上进行测试。我不确定它有多快/有效率。
我认为你需要写一些额外的代码。例如:
if 'MICHAEL89' in map(lambda name: name.upper(), USERNAMES):
...
在本例中,我们将形成一个新列表,其中USERNAMES中的所有条目都转换为大写,然后与这个新列表进行比较。
更新
正如@viraptor所说,使用生成器而不是map更好。请看@内森的回答。