为了账号安全,请及时绑定邮箱和手机立即绑定

不区分大小写的'in'-Python

不区分大小写的'in'-Python

www说 2019-11-13 13:40:50
我喜欢使用表达if 'MICHAEL89' in USERNAMES:    ...USERNAMES清单在哪里有什么方法可以区分大小写不敏感的项目,还是需要使用自定义方法?只是想知道是否需要为此编写额外的代码。谢谢大家!
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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

    ...

或者:


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

    ...

或者,可以的,您可以定制方法。


查看完整回答
反对 回复 2019-11-13
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我会做一个包装纸,这样您就可以做到无创。至少,例如:


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

现在,if CaseInsensitively('MICHAEL89') in whatever:应按要求运行(无论右侧是列表,字典还是集合)。(可能需要付出更多的努力才能获得相似的字符串包含结果,在某些情况下避免发出警告,包括unicode等等)。


查看完整回答
反对 回复 2019-11-13
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

通常(至少在oop中),您可以使对象成形为所需的行为。name in USERNAMES不区分大小写,因此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 n in self.names)仅计算一次并将其存储在类中,依此类推...


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 1549 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信