在包含各种数据类型的Python列表中返回唯一的非数字值

时间:2017-01-29 18:25:33

标签: python string list boolean unique

我有以下表格的清单:

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种类,但会从最终列表中删除布尔值。是否有更优雅/简单的方法来实现这一目标?

4 个答案:

答案 0 :(得分:2)

你可以检查intbool,不包括前者,但包括后者(这是前者的子类):

>>> [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)]