Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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中带if条件的列表理解_Python - Fatal编程技术网

python中带if条件的列表理解

python中带if条件的列表理解,python,Python,我有一个列表,其中包含int和str类型的元素。我需要将int元素复制到另一个列表中。我尝试了一个列表理解,但它不起作用。我的等效循环正在工作 input = ['a',1,'b','c',2,3,'c','d'] output = [] [output.append(a) for a in input if type(a) == int] [无,无,无] 同样的逻辑在循环中工作 output = [] for a in input: if type(a) == int:

我有一个列表,其中包含int和str类型的元素。我需要将int元素复制到另一个列表中。我尝试了一个列表理解,但它不起作用。我的等效循环正在工作

input = ['a',1,'b','c',2,3,'c','d']
output = []
[output.append(a) for a in input if type(a) == int] 
[无,无,无]

同样的逻辑在循环中工作

output = []
for a in input:
    if type(a) == int:
        output.append(a)
print(output)
[1,2,3,]

我能知道是什么造成了不同。

当你在做:

input = ['a',1,'b','c',2,3,'c','d']
output = []
[output.append(a) for a in input if type(a) == int] 
append
返回
None
,这就是为什么很多None

顺便说一句:

这将是理想的结果

你的逻辑确实有效

但使用列表理解作为副作用是不好的,所以最好的方法是:

output=[a for a in input if type(a) == int] 
    input = ['a', 1, 'b', 'c', 2, 3, 'c', 'd']
    output = [a for a in input if type(a) == int]
input = ['a',1,'b','c',2,3,'c','d']
output=[item for item in input if type(item) is int]  or
output=[item for item in input if isinstance(item,int)]
最后的最佳选择是
isinstance

output=[a for a in input if isinstance(a,int)] 

列表理解自动创建列表-无需使用
append()

您可以使用以下解决方案来解决问题:

output = [a for a in input if type(a) == int]

惯用的解决方案是:

output=[a for a in input if type(a) == int] 
    input = ['a', 1, 'b', 'c', 2, 3, 'c', 'd']
    output = [a for a in input if type(a) == int]
input = ['a',1,'b','c',2,3,'c','d']
output=[item for item in input if type(item) is int]  or
output=[item for item in input if isinstance(item,int)]
您不想使用output.append。这是列表理解所暗示的。 您可以将理解中的第一个a更改为包含a的表达式。 append(a)是一个不返回任何值的方法调用

要将值收集到指定给变量的列表中或作为更大表达式的一部分时,请使用列表理解。不要将它们作为“for循环”的不同格式用于副作用。而是使用for循环

逗号后的空格不是必需的,但被认为是良好的样式

解决方案是:

output=[a for a in input if type(a) == int] 
    input = ['a', 1, 'b', 'c', 2, 3, 'c', 'd']
    output = [a for a in input if type(a) == int]
input = ['a',1,'b','c',2,3,'c','d']
output=[item for item in input if type(item) is int]  or
output=[item for item in input if isinstance(item,int)]
最后一个比第一个快

但当您使用:

input = ['a',1,'b','c',2,3,'c','d']
output=[]
[output.append(a) for a in input if type(a) == int] 

这意味着代码执行两个结果,一个是输出。append(a)最后附加对象,而列表理解和if条件在执行后创建一个新的列表对象。append()(Look in_IDLE)返回None,因此有三个None。

您的逻辑确实有效,只需在末尾打印(输出)。您的列表理解从未得到任何值,它只是不断地将它们提供给输出,只需编写一个if而不是“output.append(a)”,如果您希望它们进入列表理解,您的原始代码工作正常。