Python中的不区分大小写匹配
我想在一个列表中找到另一个列表里的项目,而且不想考虑大小写的问题。
mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
我之前是这样做的:
for item in mylist2:
if item in mylist1:
print "true"
else:
print "false"
但是这样做不行,因为它不区分大小写。
我知道可以用re.match("TeSt", "Test", re.IGNORECASE)来处理大小写问题,但我该怎么把它应用到我的例子里呢?
3 个回答
0
其他的回答都是对的。不过它们没有考虑到两个列表中可能会有大小写混合的情况。如果你需要处理这种情况的话:
mylist1 = ['fbh_q1ba8', 'fbh_q1ba9', 'fbh_q1ba10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
for item in mylist2:
found = "false"
for item2 in mylist1:
if item.lower() == item2.lower():
found = "true"
print found
2
为什么不直接这样做:
for item in mylist2:
if item.lower() in [j.lower() for j in mylist1]:
print "true"
else:
print "false"
这里使用了 .lower()
方法来进行比较,这样就能得到想要的结果。
6
使用 str.lower()
来统一大小写:
for item in mylist2:
print item.lower() in mylist1
in
操作符可以直接返回 True
或 False
,所以最简单的办法就是直接打印这个结果:
>>> mylist1 = ['fbh_q1ba8', 'fhh_q1ba9', 'fbh_q1ba10','hoot']
>>> mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
>>> for item in mylist2:
... print item.lower() in mylist1
...
True
False
False
True
False
False
False
如果 mylist1
里面有大小写混合的值,你需要明确地写出循环;可以用一种叫做 生成器表达式 的方式来生成小写的值;这样测试时只会把需要的小写元素进行处理,以确保找到匹配项:
for item in mylist2:
print item.lower() in (element.lower() for element in mylist1)
演示
>>> mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
>>> for item in mylist2:
... print item.lower() in (element.lower() for element in mylist1)
...
True
False
False
True
False
False
False
另一种方法是使用 any()
:
for item in mylist2:
print any(item.lower() == element.lower() for element in mylist1)
any()
也有短路特性;一旦找到一个 True
的值(也就是找到一个匹配的元素),生成器表达式的迭代就会提前停止。不过,这个方法在每次迭代时都要把 item
转换成小写,所以效率稍微低一点。
另一个演示:
>>> for item in mylist2:
... print any(item.lower() == element.lower() for element in mylist1)
...
True
False
False
True
False
False
False