2017-08-01 33 views
0

我編寫了一段代碼來遍歷一個列表,查看是否有一行包含一個或多個關鍵詞:轉換代碼列表理解

STRINGS_TO_MATCH = [ "Foo", 
        "Bar", 
        "Oggle" ] 

for string in STRINGS_TO_MATCH 
    if string in line: 
     val_from_line = line.split(' ')[-1] 

有誰碰巧知道是否有一種方法,使這更可讀?在這裏列表理解是否更合適?

+1

'線'是什麼? –

+0

另外,'val_from_line'應該是一個列表嗎? –

+0

每個輸入文件都有100個隨機行。當我遍歷文件時,每行包含每行。 val_from_line也會包含文件中的特定字段。 – Shibby

回答

2

這裏要記住的一點是,內涵是表達,其目的是創建一個價值 - 列表解析創建列表,字典內涵創建類型的字典,並設置推導式創建集。在這種情況下,他們不太可能提供幫助,因爲您沒有創建任何此類對象。

您的代碼示例不完整,因爲它不提供任何與它提取的val_from_line值。我假設你想從line中提取最後一個「單詞」,其中包含STRINGS_TO_MATCH中的任何字符串,但很難處理這些不完整的信息,因此,就我所知,這個答案可能完全沒用。

假設我是正確的,最簡單的方法,以找出是否line包含任何STRINGS_TO_MATCH的是使用表達

any(s in line for s in STRINGS_TO_MATCH) 

這將使用所謂的發電機表達,這是類似列表理解 - 解釋器可以迭代它以產生一系列值 - 但它不會創建值列表,它只是將它們創建爲客戶端代碼(在這種情況下,內置的any功能)請求它們。所以我可能會重寫代碼爲

if any(s in line for s in STRINGS_TO_MATCH): 
    val_from_line = line.split(' ')[-1] 

我將離開你來決定你真的想後做什麼,與警告注意,此代碼執行後val_from_line可能會或可能不存在(取決於是否不是條件是真的),這從來不是一個完全舒適的情況。

+0

這正是我所期待的!謝謝! – Shibby