如何使用filter()从包含字符串和数字的列表中删除所有字符串?

时间:2017-09-25 00:02:32

标签: python list filter

我有一个列表例如

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

4 个答案:

答案 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)处理文字类型,但不会处理complexfractions.Fractiondecimal.Decimal或第三方数字类型。

答案 1 :(得分:4)

如果您正在寻找filter,可以让lambda更加优雅。

from numbers import Number
new_list = list(filter(lambda x: isinstance(x, Number), old_list)) 

numbers.Number是注入的intfloat以及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' >>>

  • [1,2,'a','b'] = 1,2
  • [1,'a','b',0,15] = 1,0,15
  • [1,7,'af','1','123',123] = 1,7,123