如何通过python查找字符串中多个子字符串的索引?

时间:2015-09-22 00:28:28

标签: python

我想在字符串中找到某些字符的位置,例如" FC"或" FL"。对于像FC这样的单个案例,我使用find()函数返回字符串中字符的索引,如下所示。

for line in myfile:
    location = line.find('FC')

但是在添加FL时,如何在for循环中不使用if语句的情况下添加它?我不想添加冗余线路,所以我希望有一个优雅的解决方案。

每一行都包括" FC"或" FL"但不是两个。

4 个答案:

答案 0 :(得分:3)

  

每一行都包含“FC”或“FL”,但不包括两者。

这使得以下有些hacky技巧成为可能:

location = max(line.find(sub) for sub in ("FC", "FL"))

这个想法是两个值中的一个,一个是-1,另一个是积极的(找到它的索引),所以值越大就是位置。

请注意,如果找到“FC”,则该方法仍将搜索“FL”而未找到它,如果搜索的字符串较长,则会降低性能,而使用条件的解决方案将避免此冗余计算。但是如果字符串很短,那么使用最少量的python代码并让C做所有思考可能是最快的(尽管你应该测试你的情况,如果真的很重要)。

您还可以避免对这个简单的函数调用使用for comprehension:

location = max(map(line.find, ("FC", "FL")))

答案 1 :(得分:1)

如果您想要最优雅的解决方案,那么条件可能是您的解决方案。它不会成为一个多余的"但是它会让你的代码看起来很好看和可读:

<<

答案 2 :(得分:1)

你可以这样做:

for line in myfile:
    location = [line.find(substring) for substring in ('FC', 'FL') if line.find(substring) != -1][0]

它类似于@NathanielFord建议的解决方案,唯一的区别是,我将if line.find(substring) != -1添加到生成器以解决我指向的问题,并将具有零索引的元素移动到同一行以使其成为短。 (@NathanielFord,对不起你在我在评论中提出这个问题之前删除了你的答案)

虽然,这不是一个非常优雅的解决方案,因为它会调用.find()两次,但它比使用fors更短。

答案 3 :(得分:0)

有点不清楚你想要的输出是什么,并且有更优雅的方法来处理它,具体取决于你,但基本上你正在寻找:

def multifind(line):
    for substring in ['FC', 'FL']:
        location = line.find(substring)
        if location is not -1:
            return location
    return None

locations = [multifind(line) for line in myfile]

示例运行:

myfile = ["abcFCabc","abFLcabc", "abc", ""]
>>> def multifind(line):
...     for substring in ['FC', 'FL']:
...         location = line.find(substring)
...         if location is not -1:
...             return location
...     return None
... 
>>> locations = [multifind(line) for line in myfile]
>>> locations
[3, 2, None, None]

请注意,这不如for循环中if的解决方案那么优雅。