我喜欢用这个表达方式

if 'MICHAEL89' in USERNAMES:

...

其中USERNAMES是一个列表

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

谢谢大家!

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

...

或者:

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

...

或者,是的,您可以制作自定义方法。

if 'CaseFudge'.lower() in [x.lower() for x in list]

[...]创建整个列表。 (name.upper() for name in USERNAMES)一次只能创建一个生成器和一个需要的字符串 - 如果你经常进行这种操作,可以节省大量内存。 (如果您只是创建一个每次重复检查的小写用户名列表,可以节省更多费用)

出于性能原因,在构建字典时更喜欢降低所有键。

if [x.lower()for list in list]是否是列表解析,是(USERNAMES中name的name.upper())元组理解?或者它有另一个名字?

@otocan这是一个生成器表达式。

@nmichaels谢谢,只是想知道google是什么

我会做一个包装,所以你可以是非侵入性的。最低限度,例如...:

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的情况下避免警告等)。

如果在''Michael89':True}中CaseInsensitively('MICHAEL89'),那对dict不起作用的尝试:print"found"

Xavier:你需要CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}才能工作,这可能不属于"按要求行事"。

因为只有一种明显的方法可以做到这一点。这种感觉很重,除非它会被大量使用。那就是说,它非常顺利。

@Nathon,在我看来,必须有创地改变容器是"感觉沉重"的操作。一个完全非侵入性的包装:一个人可以得到多少"更轻"?!不多;-)。 @Xavier,RHS是带有混合大小键/项目的dicts或set需要他们自己的非侵入性包装器(部分短etc.和"需要更多努力"部分我的答案;-)。

我对沉重的定义涉及编写相当多的代码来制作一些只能使用一次的东西,其中一个不太强大但更短的版本会做。如果不止一次使用它,那是非常明智的。

通常(至少在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)一次并将其存储在类中,依此类推......

这是一种方式:

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

...

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

AttributeError:'list'对象没有属性'lower'

@Jeff那是因为你的一个元素是一个列表,两个对象都应该是一个字符串。哪个对象是列表?

我会投票给你,但除非你编辑你的答案我不能。你是绝对正确的。

@Jeff我补充说明。

我想你必须写一些额外的代码。例如:

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

...

在这种情况下,我们正在形成一个新列表,其中USERNAMES中的所有条目都转换为大写,然后与此新列表进行比较。

更新

正如@viraptor所说,使用生成器代替map更好。见@ Nathon的回答。

或者您可以使用itertools功能imap。它比发电机快得多,但实现了同样的目标。

建议将str.casefold用于不区分大小写的字符串匹配。 @ nmichaels的解决方案可以简单地进行调整。

使用:

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

要么:

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

根据文档:

Casefolding is similar to lowercasing but more aggressive because it

is intended to remove all case distinctions in a string. For example,

the German lowercase letter '?' is equivalent to"ss". Since it is

already lowercase, lower() would do nothing to '?'; casefold()

converts it to"ss".

你可以做到

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

ifilter函数来自itertools,这是我在Python中最喜欢的模块之一。它比生成器更快,但只在调用时才创建列表的下一个项目。

只是要添加,模式可能需要转义,因为它可能包含"。","?"等字符,这在正则表达式模式中具有特定含义。使用re.escape(raw_string)来做到这一点

我的5(错)美分

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

UPDATE

哎哟,完全同意@jpp,我会继续作为不良做法的一个例子:(

这是错的。当这不是OP想要的时候,考虑'a' in"".join(['AB']).lower()返回True。

python不区分大小写的列表比较_关于列表:不区分大小写’in’ – Python相关推荐

  1. python怎样设置列表翻译_翻译:《实用的Python编程》01_05_Lists

    1.5 列表 本节介绍 Python 原始数据类型列表(list). 列表是一种有序的集合. 创建列表 使用方括号 [] 来定义列表字面量. names = [ 'Elwood', 'Jake', ' ...

  2. python函数使用易错点_大部分人都会忽略的Python易错点总结

    python中复数实现(-2) ** 0.5和开根号sqrt(-2)的区别 (-2)**0.5和sqrt(-2)是不同的,前者是复数后者是会报错的. print((-2)**0.5) #输出:(8.6 ...

  3. python能做大型网站么_前几天有人讨论Python做的大型网站

    除了 http://www.v2ex.com/t/18508 提到的众所周知的 google youtube douban sourceforge yahoo delicious 还有 http:// ...

  4. 我们编写的python代码在运行过程中_在Rust代码中编写Python是种怎样的体验?

    原标题:在Rust代码中编写Python是种怎样的体验? 作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前 ...

  5. python自学第8天字典_孤荷凌寒自学python第十一天初识Python的字典类

    孤荷凌寒自学python第十一天初识Python的字典类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的字典其实是一张二维对照表 下面举例说明: 键名Key 姓名 性别 身高 ...

  6. python网络通信的几种方式_两种方式,java=python,使用py4j进行通信

    我使用py4j实现python和java之间的通信,能够从java端调用python方法.但从python我不能发送任何对象或调用java方法.这是我试过的密码.在 我的java代码:public i ...

  7. python完全支持面向对象编程思想_面向对象的编程思想和Python的类,访问和属性,继承...

    本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承. 复制代码 一.访问权限: Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问 ...

  8. python真是最烂的语言_在大型项目上,Python 是个烂语言吗?

    展开全部 是存在的东西就不能用烂来形容,也许只是不对某些人的爱.e68a84e8a2ad3231313335323631343130323136353331333363396464 用 Boost 去 ...

  9. python执行js脚本安全吗_手把手教你如何使用Python执行js代码

    前言 各位小伙伴,大家好,这次咱们来说一下关于爬虫方向的一个知识,Python如何执行js,快来看看吧!!! 为什么要引出Python执行js这个问题? 都说术业有专攻,每个语言也都有自己的长处和短处 ...

  10. python给图片加半透明水印_图片添加半透明文字水印 Python

    效果 python marker.py -f ./input/test.png -m '添加水印' 功能 使用知名python图片处理库PIL,为图片添加文字水印. 实现 步骤:根据文字生成水印图片: ...

最新文章

  1. 八月十二日,周二总结
  2. 提升系统 10 倍性能的 10 个建议!
  3. spring的钩子_spring--BeanPostProcesstor
  4. SAP CRM WebClient UI的cancel按钮处理
  5. python 倒叙 数组_Python函数合集:68个内置函数请收好!
  6. 发布一个jQuery插件:formStorage
  7. Java中的main()方法是强制性的吗?
  8. 不同操作系统上DNS客户端操作区别汇总
  9. matlab绘图颜色RGB
  10. kux格式视频转换为mp4(ffmpeg)
  11. 高等数学总结(无穷级数)
  12. [embeded] Relocations in generic ELF (EM: 183)
  13. 1和new Number(1)的区别
  14. 7.2 Flowable 背压
  15. 走进游戏中的美术:游戏美术风格介绍
  16. python做excel数据条件_懂点EXCEL就行!教你利用Python做数据筛选(上)
  17. 详解动态规划01背包问题--JavaScript实现
  18. Docker——安装和启动
  19. 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless
  20. 苹果鼠标怎么充电_无线充电器怎么用?看一次就会了!-装修攻略

热门文章

  1. Git GitHub GitLab 超全面学习笔记 -- 匠心之作
  2. SQL:with as用法
  3. 迅雷android 电视,【迅雷电视助手】迅雷电视助手安卓版(Android)2.0下载_太平洋下载中心...
  4. Android 查看 wifi 密码
  5. 蓝牙技术|传统手表品牌加入智能手表竞争,智能手表市场持续火热
  6. 二级c语言笔试试题及答案,1996年9月全国计算机等级考试二级C语言笔试试题及答案...
  7. 购物网站首页设计(HTML CSS JS layui )
  8. 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
  9. html语言文档格式,HTML文档基本格式介绍,HTML基本标记介绍?
  10. 张孝祥张老师一路走好!