Python过滤器没有按预期工作

时间:2016-07-05 01:35:05

标签: python

我有以下Python代码:

a = [1,2,3,'4','55',6]
filter(int,a)

输出结果为:

[1, 2, 3, '4', '55', 6]

filter()应该从提供的序列中删除元素,这些元素转换为false,并仅返回转换为true的元素。

我希望输出为:

[1,2,3,6]

因为这些是我列表中唯一的整数。 我错过了必不可少的东西吗

4 个答案:

答案 0 :(得分:3)

改为使用isinstance

>>> a =[1,2,3,'4','55',6]
>>> filter(lambda x: isinstance(x, int),a)
[1, 2, 3, 6]

int会将每个对象转换为整数,因为列表中的所有数字/字符串都是非零的filter,因为它们在布尔上下文中评估True,所以选择它们。相反,您的目标似乎是选择已经整合的对象并且可以使用isinstance来完成。

答案 1 :(得分:2)

filter()调用可调用的函数(int)与iterable中的每个项目,并返回Truthy。由于int('56')会产生56,因此它是Truthy并包含在结果中。你可能想要这样的东西:

filter(lambda x: isinstance(x, int), a)

或更好:

[x for x in a if isinstance(x, int)]

答案 2 :(得分:1)

我同意@ niemmi和@ zondo的解决方案,即

filter(lambda x: isinstance(x, int), a)

现在问题是为什么filter(int,a)不起作用?

过滤最终调用 function(val),如果返回false,则将其过滤掉。

>>> int('4')  # Which is returning 4, and its true.
4

但如果你这样称呼,

>>> a =[1,2,3,'4','0',6]
>>> filter(int, a)
[1,2,3,4,6]

>>> a =[1,2,3,'4','55a',6]
>>> filter(int, a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55a'

答案 3 :(得分:0)

试试这个:

[x for x in a if isinstance(x, int)]

filter(lambda x: isinstance(x, int), a)