[英]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 一開始可能會令人困惑,但您會注意到for
和if
的順序與嵌套循環中的順序相同。
你可以做:
[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.