我有以下Python代码:
a = [1,2,3,'4','55',6]
filter(int,a)
输出结果为:
[1, 2, 3, '4', '55', 6]
filter()
应该从提供的序列中删除元素,这些元素转换为false,并仅返回转换为true的元素。
我希望输出为:
[1,2,3,6]
因为这些是我列表中唯一的整数。 我错过了必不可少的东西吗
答案 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)