簡體   English   中英

嵌套 for 和 if 在列表推導中

[英]nested for and if inside a list comprehension

我有以下代碼,其中有 for 和 if 。

lines = ['apple berry Citrus ', 34, 4.46, 'Audi Apple ']

corpus = [ ]

for line in lines:

    # Check if the element is string and proceed
    if isinstance(line, str):

        # Split the element and check if first character is upper case
        for word in line.split():
            if word[0].isupper():
                
                # Append the word to corpus result
                corpus.append(word)
print(corpus)
# Output : ['Citrus', 'Audi', 'Apple']

我試圖在列表理解中做到這一點,但失敗了。 我已經嘗試如下。

# corpus = [  word if word[0].isupper() for word in line.split()  for line in lines if isinstance(line, str)]

我如何在列表理解中實現這一點?

以下將起作用:

corpus = [
    word for line in lines if isinstance(line, str) 
         for word in line.split() if word[0].isupper()
]

嵌套推導中的 scope 一開始可能會令人困惑,但您會注意到forif的順序與嵌套循環中的順序相同。

你可以做:

[word for line in lines if isinstance(line, str) 
     for word in line.split() if word[0].isupper()]

另一種方法是使用filter預過濾列表lines

[word for line in filter(lambda e: isinstance(e, str), lines) 
      for word in line.split() if word[0].isupper()]

或者,正如評論中所指出的,您可以使用以下命令消除lambda

[word for line in filter(str.__instancecheck__, lines) 
      for word in line.split() if word[0].isupper()]

甚至兩個過濾器:

[word for line in filter(str.__instancecheck__, lines)
      for word in filter(lambda w: w[0].isupper(), line.split())]

作為一般規則,您可以將執行 corpus.append(xxxx) 的嵌套循環的內部部分放在列表理解的開頭(xxx)。 然后添加沒有“:”的嵌套 for 循環和條件。

corpus = [ word                          # from corpus.append(word)
           for line in lines             # ':' removed ... 
               if isinstance(line,str) 
                   for word in line.split() 
                       if word[0].isupper() ]

# on a single line:
corpus = [ word for line in lines if isinstance(line,str) for word in line.split() if word[0].isupper() ]

print(corpus) # ['Citrus', 'Audi', 'Apple']

暫無
暫無

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

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