在列表中查找子串的Pythonic方式
我有一个字符串列表,类似于
mytext = ['This is some text','this is yet more text','This is text that contains the substring foobar123','yet more text']
我想找到第一个以foobar开头的字符串。如果我在用grep命令查找的话,我会搜索foobar*。我现在的解决方案是这样的
for i in mytext:
index = i.find("foobar")
if(index!=-1):
print i
这个方法运行得很好,但我在想有没有更“好”的方法(也就是更符合Python风格的方法)来做到这一点?
谢谢,
迈克
5 个回答
6
这段代码的意思是……
首先,它定义了一些变量,这些变量就像是用来存储信息的盒子。你可以把它们想象成一个个小抽屉,里面放着不同的东西。
接下来,代码会执行一些操作,比如计算、判断或者循环。这些操作就像是给这些盒子里的东西进行整理、分类或者重复使用。
最后,代码会输出结果,也就是把处理后的信息展示出来。就好比你把整理好的东西放到桌子上,让别人看到。
总之,这段代码就是在做一些数据处理的工作,最终把结果呈现给我们。
for s in lst:
if 'foobar' in s:
print(s)
10
如果你真的想找到一个以foobar开头的字符串(这就是你所说的,虽然和你的代码差别很大,还有你提到的grep——这真是矛盾啊!),可以试试这个:
found = next((s for s in mylist if s.startswith('foobar')), '')
如果我的列表中没有任何项符合这个条件,found
的结果会是一个空字符串。你也可以用itertools等其他工具来替代简单的生成表达式,但关键的技巧是用next
这个内置函数,并设置一个默认值(仅适用于Python 2.6及更高版本)。
16
你还可以使用一种叫做列表推导式的方法:
matches = [s for s in mytext if 'foobar' in s]
(如果你真的想找的是以 'foobar' 开头的字符串,就像 THC4k 提到的,可以考虑以下内容:
matches = [s for s in mytext if s.startswith('foobar')]