在列表中查找子串的Pythonic方式

4 投票
5 回答
886 浏览
提问于 2025-04-15 13:31

我有一个字符串列表,类似于

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')]

撰写回答