如何解决嵌套 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()
]
嵌套推导式中的作用域起初可能会令人困惑,但您会注意到 for
和 if
的顺序与嵌套循环中的顺序相同。
你可以这样做:
[word for line in lines if isinstance(line,str)
for word in line.split() if word[0].isupper()]
另一种方法是使用 lines
对列表 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']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。