我有一个包含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,]
我能知道有什么区别吗?
答案 0 :(得分:5)
在做的时候:
input = ['a',1,'b','c',2,3,'c','d']
output = []
[output.append(a) for a in input if type(a) == int]
append
返回None
,这就是为什么很多都不是的原因
顺便说一句,:
print(output)
将是理想的结果。
您的逻辑实际上有效!
但是使用列表理解作为副作用不是很好,所以最好的方法是:
output=[a for a in input if type(a) == int]
最后的最佳选择将是isinstance
:
output=[a for a in input if isinstance(a,int)]
答案 1 :(得分:2)
一种惯用的解决方案是:
input = ['a', 1, 'b', 'c', 2, 3, 'c', 'd']
output = [a for a in input if type(a) == int]
您不想使用output.append。列表理解暗示了这一点。 您可以将理解中的第一个a更改为包含a的表达式。 output.append(a)是一个返回NONE的方法调用
当您想将值收集到要分配给变量或作为较大表达式的一部分的列表中时,请使用列表推导。请勿将它们作为“ for循环”的其他格式用于副作用。而是使用for循环。
逗号后面的空格不是必需的,但是被认为是很好的样式。
答案 2 :(得分:1)
input = ['a',1,'b','c',2,3,'c','d']
output = [a for a in input if type(a) == int]
列表理解会自动创建列表-无需使用append()
答案 3 :(得分:0)
您可以使用以下解决方案来解决您的问题:
output = [a for a in input if type(a) == int]
答案 4 :(得分:0)
解决方案是:
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]
这意味着代码执行两个结果,一个是在末尾添加 output.append(a)附加对象,如果条件创建了一个新的列表对象,则 list理解执行后,作为a.append()( Look_in_IDLE )返回 None ,因此有三个None。