【问题标题】:Find item in list by type按类型在列表中查找项目
【发布时间】:2014-12-15 20:26:03
【问题描述】:

我有一个可以包含多个不同类型元素的列表。 我需要检查这个列表中是否有一个或多个特定类型的元素并获取它的索引。

l = [1, 2, 3, myobj, 4, 5]

我可以通过简单地遍历我的列表并检查每个元素的类型来实现这个目标:

for i, v in enumerate(l):
  if type(v) == Mytype:
    return i

是否有更 Pythonic 的方式来完成相同的结果?

【问题讨论】:

  • 您需要该类型所有元素的索引,还是只需要第一个?
  • @BrenBarn 在我的具体情况下,我只需要第一个,但“通用”解决方案将不胜感激。
  • 您可以使用推导式或生成器 exp - 但这意味着您必须遍历整个列表才能查看是否至少有一个。您的方法更有效 IMO。
  • if is instance(v, Mytype): 会更好,否则这似乎很好。

标签: python list search types


【解决方案1】:

您可以使用nextgenerator expression

return next(i for i, v in enumerate(l) if isinstance(v, Mytype)):

此解决方案的优点是它像您当前的解决方案一样懒惰:它只会检查必要的项目。

另外,我使用了isinstance(v, Mytype) 而不是type(v) == Mytype,因为它是 Python 中类型检查的首选方法。见PEP 0008

最后,应该注意的是,如果找不到所需的项目,此解决方案将引发StopIteration 异常。你可以用 try/except 来捕捉它,或者你可以指定一个默认值来返回:

return next((i for i, v in enumerate(l) if isinstance(v, Mytype)), None):

在这种情况下,如果没有找到,将返回None

【讨论】:

  • 而这种方式如何获取元素的索引呢?
  • @Nick - 对不起,我误读了你的问题。请查看我的编辑。
【解决方案2】:

您可以使用列表推导。

获取所有字符串类型的元素:

b = [x for x in a if isinstance(x,str)]

获取字符串类型元素的所有索引:

b = [x[0] for x in enumerate(a) if isinstance(x[1],str)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多