【问题标题】:Return unique non-digit values in a Python list containing various data types在包含各种数据类型的 Python 列表中返回唯一的非数字值
【发布时间】:2017-06-14 22:20:22
【问题描述】:

我有一个如下形式的列表:

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 排序工作,但将从最终列表中删除布尔值。有没有更优雅/更简单的方法来实现这一点?

【问题讨论】:

  • 你可以切掉前三个值:full_list[3:] == ["string", False, True]
  • 嘿#Peter 他不知道数组,他只是给我们一个例子。这段数据在程序中将是动态的(据我了解)。
  • @user5676973 是正确的。

标签: python string list boolean unique


【解决方案1】:

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

>>> [x for x in full_list if not isinstance(x, int) or isinstance(x, bool)]
['string', False, True]

【讨论】:

  • 对于任何类型的号码,您都可以使用numbers.NumberABC
【解决方案2】:

您的方法不适用于实数。 可以这样吗?

new_list = [i for i in full_list if (type(i) != int) and (type(i) != float)]

【讨论】:

  • 为什么要排除浮动?从问题str.isdigit 是排除标准和"1.2".isdigit()False
  • 那么 type() 似乎是一个可行的解决方案,以防您需要区分 py 中的 bool 和 int
【解决方案3】:

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

或者应用一个已经实现了唯一性的外部库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的作者

【讨论】:

  • uniques 函数有什么意义,因为在集合中所有元素都是唯一的?
  • @Jérôme 这样您就可以按顺序迭代,但过滤掉存储在集合中的非唯一项。如果您只是迭代集合,您将失去排序。
【解决方案4】:

假设

  • 您想丢弃整数 (1, 2, 3),但不想丢弃表示整数的字符串 ('1', '2', '3')

  • 您希望每个元素在结果中都是唯一的(您的标题所暗示的)

  • 顺序无所谓

您可以使用sets。并使用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 也包含浮点数。您的示例只有整数,但您没有明确提到所有数字都应该是整数。

【讨论】:

  • 订单重要吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多