我的问题是如何从一个列表中删除所有字符串,例如如果我有list=['hello',1,2,3,4,'goodbye','help']
,那么结果应该是list=[1,2,3,4]
我的问题是如何从一个列表中删除所有字符串,例如如果我有list=['hello',1,2,3,4,'goodbye','help']
,那么结果应该是list=[1,2,3,4]
isinstance
过滤掉那些字符串元素。还要注意不要将变量命名为 list
,这会遮蔽内置的 list
。>>> from numbers import Real
>>> lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help']
>>> [element for element in lst if isinstance(element, Real)]
[1, 2, 3, 4]
>>> [element for element in lst if isinstance(element, int)]
[1, 2, 3, 4]
或者
>>> [element for element in lst if not isinstance(element, str)]
[1, 2, 3, 4]
isinstance
来实现,但与user3100115的另一个答案不同,我会将你不想要的类型列入黑名单,而不是仅允许几种类型。不确定哪种更适合你的特殊情况,只是作为替代方案添加。它也可以在不导入任何内容的情况下运行。lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help']
filtered = [element for element in lst if not isinstance(element, str)]
print(filtered)
# [1, 2, 3, 4]
除了使用列表推导式,您还可以使用内置的filter
函数。它会返回一个生成器,因此要直接打印它,您必须先将其转换为列表。但是,如果您要遍历它(例如使用for
循环),请不要将其转换,这样由于“惰性求值”,它将更快且消耗更少的内存。如果您将上面的示例中的方括号替换为圆括号,则可以实现相同的效果。
lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help']
filtered = list(filter(lambda element: not isinstance(element, str), lst))
print(filtered)
# [1, 2, 3, 4]
你可以像@user3100115一样使用列表推导式,或者使用“lisp/lambda方法”
>> l = [1, 2, 'a', 'b']
>> list(filter(lambda a: isinstance(a, int), l))
[1, 2]
顺便提一下,不要把你的变量命名为list
,这已经是Python函数的名称了。 :)
lambda
来使用filter
,那么列表推导式或生成器表达式总是更快且同样简洁(假设迭代的变量名较短)。如果需要lambda
才能让它们工作,请不要使用map
/filter
。 - ShadowRanger