【问题标题】:Filter list's elements by type of each element按每个元素的类型过滤列表的元素
【发布时间】:2016-10-03 04:38:15
【问题描述】:

我有一个包含不同类型数据(字符串、整数等)的列表。例如,我需要创建一个仅包含 int 元素的新列表,以及另一个仅包含字符串元素的列表。怎么做?

【问题讨论】:

  • 使用for循环和isinstance(element, int)
  • 你可能想试试filter 方法,或者列表理解

标签: python


【解决方案1】:

您可以通过list comprehension 完成此操作:

integers = [elm for elm in data if isinstance(elm, int)]

data 是数据。上面所做的是创建一个新列表,用满足if 之后条件的data (elm) 元素填充它,这将检查元素是否是int 的实例。你也可以使用filter:

integers = list(filter(lambda elm: isinstance(elm, int), data))

上面会根据传入的 lambda 过滤掉元素,过滤掉所有非整数。然后,您也可以将其应用于字符串,使用 isinstance(elm, str) 检查是否为字符串实例。

【讨论】:

  • @IlyaSpark 没问题,很高兴为您提供帮助
  • isinstance(True, int) -> True
  • @EgorOsaulenko 是的,Python 中的布尔值实际上是伪装的整数。真为 1,假为 0。
  • 整数 = [elm for elm in data if isinstance(elm, int) 而不是 isinstance(elm, bool)]
  • 我自己用python开发的时间不长(来自c#),这个是一个惊喜。我的意思是 - 是的,在 bool 的实施过程中它看起来很合适,但现在..
【解决方案2】:

按类型对列表进行排序,然后使用groupby对其进行分组:

>>> import itertools
>>> l = ['a', 1, 2, 'b', 'e', 9.2, 'l']
>>> l.sort(key=lambda x: str(type(x)))
>>> lists = [list(v) for k,v in itertools.groupby(l, lambda x: str(type(x)))]
>>> lists
[[9.2], [1, 2], ['a', 'b', 'e', 'l']]

【讨论】:

  • OP 似乎想要没有子列表的单独列表,但还是很好的答案!
  • @AndrewL。 - 他们仍然是分开的。他们只是没有手工制作的标签。然而,这可以很容易地用字典来完成,例如lists = {k:list(v) for k,v in itertools.groupby(l, lambda x: str(type(x)))}。当然,好处是名称是自动生成的,并且可以轻松组织。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2021-12-20
  • 2020-04-13
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多