Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用filter()从包含字符串和数字的列表中删除所有字符串?_Python_List_Filter - Fatal编程技术网

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

Python 如何使用filter()从包含字符串和数字的列表中删除所有字符串?,python,list,filter,Python,List,Filter,例如,我有一份清单 list = [1,2,3,'t',4,5,'fgt',6,7,'string'] 我想使用filter()函数删除所有字符串,只留下数字。 我可以用普通的方法做,但我不能用过滤法做…有什么建议吗 因此: 不起作用…我试着用它,但仍然不起作用: 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 列表(过滤器(类型(a[-1])==str,a)) TypeError:“bool”对象不可调用 您可以使用isinstance检查整数或浮点: old_list = [1,2,

例如,我有一份清单

list = [1,2,3,'t',4,5,'fgt',6,7,'string']
我想使用
filter()
函数删除所有字符串,只留下数字。 我可以用普通的方法做,但我不能用过滤法做…有什么建议吗

因此:

不起作用…我试着用它,但仍然不起作用:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
列表(过滤器(类型(a[-1])==str,a))
TypeError:“bool”对象不可调用

您可以使用
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]

虽然您可以使用
过滤器
,但不要这样做。您需要一个
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)]
这比等效的
过滤器
+
lambda
简单得多:

new_list = list(filter(lambda x: isinstance(x, (int, float)), old_list))

如中所述,为了普遍接受所有“数字相似项”,您应该实际使用
isinstance
number.number
;使用
(int,float)
处理文字类型,但不会处理
复杂类型、
分数.Fraction
十进制.decimal
或第三方数字类型。

如果您正在寻找
过滤器
,您可以将
lambda
塑造得更优雅一些

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

numbers.Number
int
float
以及
complex
的注入超类。对于实数类型,请使用
numbers.real

不要使用隐藏内置名称(如
list
)的变量名。这可能会导致以后出现各种恼人的问题(特别是如果您想在Python3上使用
filter
)。通常我看到人们使用一个尾随下划线
list.
或省略人声
lst=
或附加一个数字
list1=
。但是,您应该尽可能使变量名自我解释,这意味着避免将列表命名为“列表”。如果您的问题得到了回答,您可以。既然条件是“保留数字”,为什么不
numbers.Number
@MSeifert将包括复数。。。不确定OP对此有多深入的思考,但还是进行了编辑。注意:遗憾的是,从
数字.Number
数字.Real
也将排除
十进制.decimal
;由于不清楚的原因,可能与防止代码盲目地将其转换为
浮点
有关,它没有注册为
实数
有理
类型(即使它在逻辑上与
浮点
一样是“实数”类型,实际上是一个有理数类型,具有10个分母的幂)。因此,如果您要查找所有非复数,则需要使用特殊的大小写
十进制.decimal
,例如
isinstance(x,(Real,decimal.decimal))
@ShadowRanger谢谢您的提醒,我没有意识到这一点。你凭什么认为他们需要一个
lambda
函数?@StefanPochmann:a
def
函数在增加复杂性和降低性能方面是等效的,而且在短期内,没有明显和正确的方法来委托给可以执行测试的内置函数(这至少可以想象运行得更快)。
filter
基本上是C内置的一个微优化,在所有其他情况下都是一个悲观的想法;你99%的时间都想要listcomp/genexpr。@StefanPochmann:我是即兴说的;如果我在技术上是准确的,我会说“要做到这一点,您需要从头编写一个自定义函数"也就是说,99%的情况下,当人们对自定义函数使用
filter
时,他们使用的是一次性
lambda
函数,尽管
def
是等效的,只是命名的,可能更强大。谢谢回答,我现在如何结束这个问题???或者我该怎么做来表示我完成了?它总是打开的吗w在这里。非常感谢much@Agentπ:如果您的问题由其中一个答案完全回答,只需单击该答案投票按钮下方的灰色复选框,将其标记为已接受。
from numbers import Number
new_list = list(filter(lambda x: isinstance(x, Number), old_list))