如何从列表中删除所有字符串

5

我的问题是如何从一个列表中删除所有字符串,例如如果我有list=['hello',1,2,3,4,'goodbye','help'],那么结果应该是list=[1,2,3,4]

3个回答

9
你需要使用 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]

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

1

你可以像@user3100115一样使用列表推导式,或者使用“lisp/lambda方法”

>> l = [1, 2, 'a', 'b']
>> list(filter(lambda a: isinstance(a, int), l))
[1, 2]

顺便提一下,不要把你的变量命名为list,这已经是Python函数的名称了。 :)


1
如果你需要一个 lambda 来使用 filter,那么列表推导式或生成器表达式总是更快且同样简洁(假设迭代的变量名较短)。如果需要 lambda 才能让它们工作,请不要使用 map/filter - ShadowRanger
我添加了这个“lisp”方法,以便完整性,因为当时只有一个关于列表推导的答案。我不知道它更慢。谢谢! - Ricardo Magalhães Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接