我喜欢用这个表达

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)并将其存储在类中,等等……

其他回答

我需要这个字典而不是列表,杨晨的解决方案是最优雅的情况下,所以我修改了一点:

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:

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)

你可以这样做

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中我最喜欢的模块之一。它比生成器快,但只在调用时创建列表的下一项。

通常(至少在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)并将其存储在类中,等等……