我想在字符串中找到某些字符的位置,例如" FC"或" FL"。对于像FC
这样的单个案例,我使用find()
函数返回字符串中字符的索引,如下所示。
for line in myfile:
location = line.find('FC')
但是在添加FL
时,如何在for循环中不使用if语句的情况下添加它?我不想添加冗余线路,所以我希望有一个优雅的解决方案。
每一行都包括" FC"或" FL"但不是两个。
答案 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
的解决方案那么优雅。