我有一个列表例如
list = [1,2,3,'t',4,5,'fgt',6,7,'string']
我希望使用filter()
函数删除所有字符串以留下数字。
我可以用常规方法做到这一点,但我不能用过滤方法做任何提示吗?
这样:
list(filter(type(i)==str,a)))
不起作用......我试图使用它,但仍然不起作用:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
list(filter(type(a[-1])==str,a))
TypeError: 'bool' object is not callable
答案 0 :(得分:7)
虽然您可以使用filter
,但不要这样做。您需要lambda
函数才能执行此操作,并且它比同等列表推导或生成器表达式更慢且可读性更低。相反,只需使用listcomp或genexpr:
old_list = [1,2,3,'t',4,5,'fgt',6,7,'string']
new_list = [x for x in old_list if isinstance(x, (int, float))]
# or to remove str specifically, rather than preserve numeric:
new_list = [x for x in old_list if not isinstance(x, str)]
比filter
+ lambda
等价物要简单明了:
new_list = list(filter(lambda x: isinstance(x, (int, float)), old_list))
如COLDSPEED's answer所述,一般都接受所有&#34;数字相似&#34;你应该isinstance
实际使用numbers.Number
;使用(int, float)
处理文字类型,但不会处理complex
,fractions.Fraction
,decimal.Decimal
或第三方数字类型。
答案 1 :(得分:4)
如果您正在寻找filter
,可以让lambda
更加优雅。
from numbers import Number
new_list = list(filter(lambda x: isinstance(x, Number), old_list))
numbers.Number
是注入的int
和float
以及complex
的超类。对于实际类型,请改用numbers.Real
。
答案 2 :(得分:0)
您可以使用isinstance
检查整数或浮点数:
old_list = [1,2,3,'t',4,5,'fgt',6,7,'string']
new_list = list(filter(lambda x:isinstance(x, int) or isinstance(x, float), old_list))
输出:
[1, 2, 3, 4, 5, 6, 7]
答案 3 :(得分:0)
我使用了这个例子,它对我有用:
创建一个函数,该函数接受一个非负整数(正)和字符串列表,并返回一个过滤掉字符串的新列表。
oldlist = [1,2,'a','b']
def filter_list(p):
newlist = list(filter(lambda x: isinstance(x, int), oldlist))
return newlist
它过滤掉任何字符串,只留下'int'(数字)。在这里,您可以使用更多案例来代替 'oldlist' >>>