Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套在列表中的for和if_Python_Python 3.x_List_Python 2.7_List Comprehension - Fatal编程技术网

Python 嵌套在列表中的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

我有以下代码,其中有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()]
另一种方法是使用
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谢谢你的回复。