簡體   English   中英

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

[英]How to find the index of multiple sub string in a string by python?

我想在字符串中找到某些字符的位置,例如“ FC”或“ FL”。 對於像FC這樣的單一情況,我使用find()函數返回字符串中字符的索引,如下所示。

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

但是,當涉及添加FL ,如何在for循環中不使用if語句的情況下添加它? 我不想添加多余的行,因此希望有一個優雅的解決方案。

每行將包含“ FC”或“ FL”,但不能同時包含兩者。

每行將包含“ FC”或“ FL”,但不能同時包含兩者。

這使得以下一些棘手的技巧成為可能:

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

這個想法是,在兩個值中,一個將為-1,另一個將為正(找到它的索引),因此位置越大。

請注意,如果找到“ FC”,該方法仍將搜索“ FL”而不是找到它,如果要搜索的字符串很長,則會降低性能,而使用條件句的解決方案將避免這種冗余計算。 但是,如果字符串很短,則使用最少的python代碼並讓C進行所有思考可能是最快的(盡管如果確實很重要,則應測試一下情況)。

您也可以避免對此簡單的函數調用使用for理解:

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

如果您想要最優雅的解決方案,那么有條件的解決方案可能就是您的解決方案。 它不會是“多余的”行,但是它將使您的代碼看起來不錯並且可讀:

for line in myfile:
    location = line.find('FC')
    if location == -1:
        location = line.find('FL')

你可以這樣做:

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短。

尚不清楚您想要的輸出是什么,並且有更優雅的方式來處理它,但是實際上您正在尋找:

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的解決方案那么優雅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM