我有以下表格的清单:
full_list = [1, 2, 5, "string", False, True]
我想返回一个只包含非数字值的列表,如下所示:
new_list = ["string", False, True]
我最初的想法是使用isdigit()方法,但这仅适用于字符串。我可以将列表中的每个项目转换为字符串,然后调用isdigit(),但
new_list = [i for i in full_list if not str(i).isdigit()]
感觉就像一个漫长的解决方法。解决方案发布了here种类,但会从最终列表中删除布尔值。是否有更优雅/简单的方法来实现这一目标?
答案 0 :(得分:2)
你可以检查int
和bool
,不包括前者,但包括后者(这是前者的子类):
>>> [x for x in full_list if not isinstance(x, int) or isinstance(x, bool)]
['string', False, True]
答案 1 :(得分:1)
假设
你要丢弃整数(1,2,3)但不是丢弃代表整数的字符串('1','2','3')
您希望每个元素在结果中都是唯一的(标题所示)
订单无关紧要
您可以使用set
s。并使用Number
作为要检查的类,另外还要检查bool
,因为True
/ False
也是Number
个实例。
from numbers import Number
full_list = [1, 2, 5, "string", False, True]
set(full_list) - set(
i in full_list if isinstance(i, Number) and not isinstance(i, bool))
Number
也涵盖花车。您的示例只有整数,但您没有明确提到所有数字都应该是整数。
答案 2 :(得分:0)
您可以按type(item) != int
进行过滤(通常我会使用isinstance
,但您不想丢弃布尔值 - 布尔值是python中整数的子类):
filtered_list = [item for item in full_list if type(item) != int]
然后过滤重复项:
def uniques(iterable):
seen = set()
for item in iterable:
if item not in seen:
yield item
seen.add(item)
>>> list(uniques(filtered_list))
['string', False, True]
或者应用已经具有uniques实现的外部库 1 :
>>> from iteration_utilities import Iterable
>>> Iterable([1, 2, 5, "string", False, True]).filter(lambda x: type(x) != int).unique_everseen().as_list()
['string', False, True]
>>> # This time with a duplicate "False"
>>> Iterable([1, 2, 5, "string", False, False, True]).filter(lambda x: type(x) != int).unique_everseen().as_list()
['string', False, True]
1 披露:我是iteration_utilities
library
答案 3 :(得分:-1)
您的方法不适合实数。 可以这样吗?
new_list = [i for i in full_list if (type(i) != int) and (type(i) != float)]