Python 嵌套在列表中的for和if
我有以下代码,其中有for和if可选Python 嵌套在列表中的for和if,python,python-3.x,list,python-2.7,list-comprehension,Python,Python 3.x,List,Python 2.7,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
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()
]
嵌套理解中的范围一开始可能会令人困惑,但您会注意到for
和if
的顺序与嵌套循环中的顺序相同。您可以:
[word for line in lines if isinstance(line, str)
for word in line.split() if word[0].isupper()]
另一种方法是使用filter
对列表中的行进行预过滤:
[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']
非常感谢。对我来说,第一个过滤器更具可读性,因为它准确地说明了目的。谢谢@dawgT谢谢你的回复。