簡體   English   中英

沒有 if 但有 else 的列表理解

[英]list comprehension without if but with else

我的問題旨在在列表理解中使用 for 循環的 else 條件。

例子:

empty_list = []
def example_func(text):
    for a in text.split():
        for b in a.split(","):
            empty_list.append(b)
        else:
            empty_list.append(" ")

我想通過對兩個 for 循環使用列表理解來使其更清晰。

但是我如何通過為其中一個循環(在本例中為第二個)包含一個轉義子句來做到這一點。 我知道我可以在列表理解中使用 if 和 else 。 但是如何在沒有 if 語句的情況下使用 else。

有沒有辦法讓解釋器將其理解為 for 循環的轉義子句?

任何幫助深表感謝!

編輯:感謝您的回答! 事實上,我正在嘗試翻譯莫爾斯電碼。

輸入是一個字符串,包含摩爾斯電碼。 每個單詞由 3 個空格分隔。 每個單詞的每個字母由 1 個空格分隔。

def decoder(code): 
    str_list = [] 
    for i in code.split("   "): 
        for e in i.split(): 
            str_list.append(morse_code_dic[e]) 
        else: 
            str_list.append(" ") 
     return "".join(str_list[:-1]).capitalize()

print(decoder(".. -   .-- .- ...   .-   --. --- --- -..   -.. .- -.--"))

我想把整個句子分解成單詞,然后翻譯每個單詞。 內循環(一個詞的翻譯)完成后,它會啟動它的escape-clause else,添加一個空格,這樣整個句子的結構就會被保留下來。 這樣,3 個空格將被轉換為一個空格。

正如評論中指出的那樣, else並沒有多大意義,因為在for循環之后else的目的實際上是在循環正常終止(即不是通過break )時保存用於條件執行的代碼,你的循環總是,因此它總是被執行。

所以這並不是如何在列表理解中做到這一點的問題的真正答案,而是更多的替代方案。 您可以只使用兩個嵌套的join生成器表達式,一個用於句子,一個用於單詞,而不是在所有單詞后添加空格,然后刪除最后一個空格並將所有內容連接在一起:

def decoder(code): 
    return " ".join("".join(morse_code_dic[e] for e in i.split())
                    for i in code.split("   ")).capitalize()

如評論中所述,您的特定示例中的else子句毫無意義,因為它始終運行。 讓我們設計一個示例,讓我們研究模擬breakelse的可能性。

取以下字符串:

s = 'a,b,c b,c,d c,d,e, d,e,f'

假設您想像以前一樣用空格和逗號分割字符串,但您只想保留內部分割的元素,直到第一次出現c

out = []
for i in s.split(): 
    for e in i.split(','):
        if e == 'c':
            break
        out.append(e)
    else: 
        out.append('-')

可以使用iter的神秘雙參數形式模擬break ,它接受一個可調用值和一個終止值:

>>> x = list('abcd')
>>> list(iter(iter(x).__next__, 'c'))
['a', 'b']

您可以通過使用['-'] 鏈接內部可迭代對象來實現else

>>> from itertools import chain
>>> x = list('abcd')
>>> list(iter(chain(x, ['-'])
.__next__, 'c'))
['a', 'b']
>>> y = list('def')
>>> list(iter(chain(y, ['-'])
.__next__, 'c'))
['d', 'e', 'f', '-']

請注意, chain的放置在這里至關重要。 如果您要將破折號鏈接到外部迭代器,它將始終被附加,而不僅僅是在未遇到c時:

>>> list(chain(iter(iter(x).__next__, 'c'), ['-']))
['a', 'b', '-']

您現在可以使用單個表達式模擬整個嵌套循環:

from itertools import chain

out = [e for i in s.split() for e in iter(chain(i.split(','), ['-']).__next__, 'c')]

暫無
暫無

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

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