繁体   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