我喜欢用这个表达

if 'MICHAEL89' in USERNAMES:
    ...

其中USERNAMES是一个列表。


是否有任何方法来匹配不区分大小写的项目,或者我需要使用自定义方法?只是想知道是否需要为此编写额外的代码。


当前回答

我的5美分(错误的)

"".join([' a']).lower()

更新

哎呦,完全同意@jpp,我会把它作为一个糟糕做法的例子:(

其他回答

username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
    ...

另外:

if username.upper() in map(str.upper, USERNAMES):
    ...

或者,是的,您可以创建一个自定义方法。

这里有一种方法:

if string1.lower() in string2.lower(): 
    ...

为此,string1和string2对象的类型都必须是string。

我会做一个包装,这样你就不会受到伤害了。最低限度,例如……:

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

现在,如果caseinsensitive ('MICHAEL89')在whatever:应该按照要求行事(无论右边是列表、字典还是集合)。(它可能需要更多的努力来实现字符串包含的类似结果,避免在某些情况下涉及unicode的警告,等等)。

我认为你需要写一些额外的代码。例如:

if 'MICHAEL89' in map(lambda name: name.upper(), USERNAMES):
   ...

在本例中,我们将形成一个新列表,其中USERNAMES中的所有条目都转换为大写,然后与这个新列表进行比较。

更新

正如@viraptor所说,使用生成器而不是map更好。请看@内森的回答。

本教程中的例子:

list1 = ["Apple", "Lenovo", "HP", "Samsung", "ASUS"]

s = "lenovo"
s_lower = s.lower()

res = s_lower in (string.lower() for string in list1)

print(res)