首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不区分大小写的'in‘

不区分大小写的'in‘
EN

Stack Overflow用户
提问于 2010-09-02 21:56:30
回答 7查看 146.8K关注 0票数 185

我喜欢用这样的表达

代码语言:javascript
复制
if 'MICHAEL89' in USERNAMES:
    ...

其中USERNAMES是一个列表。

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

EN

回答 7

Stack Overflow用户

发布于 2010-09-02 21:59:08

代码语言:javascript
复制
username = 'MICHAEL89'
if username.upper() in (name.upper() for name in USERNAMES):
    ...

或者:

代码语言:javascript
复制
if username.upper() in map(str.upper, USERNAMES):
    ...

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

票数 223
EN

Stack Overflow用户

发布于 2010-09-02 22:45:08

我会做一个包装器,这样你就可以成为非侵入性的。最低限度,例如:

代码语言:javascript
复制
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的警告,等等)。

票数 21
EN

Stack Overflow用户

发布于 2010-09-02 23:31:05

通常(至少在oop中),你可以按照你想要的方式塑造你的对象。name in USERNAMES不区分大小写,因此USERNAMES需要更改:

代码语言:javascript
复制
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)并将其存储在类中,依此类推...

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3627784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档