我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
我喜欢用这个表达
if 'MICHAEL89' in USERNAMES:
...
其中USERNAMES是一个列表。
是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。
当前回答
为了把它写在一行里,我是这样做的:
if any(([True if 'MICHAEL89' in username.upper() else False for username in USERNAMES])):
print('username exists in list')
不过我并没有在时间上进行测试。我不确定它有多快/有效率。
其他回答
我需要这个字典而不是列表,杨晨的解决方案是最优雅的情况下,所以我修改了一点:
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 string1.lower() in string2.lower():
...
为此,string1和string2对象的类型都必须是string。
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”。
username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
...
另外:
if username.upper() in map(str.upper, 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)