按类型在列表中查找项目

4
我有一个列表,其中可能包含多种类型的元素。我需要检查这个列表中是否存在一个或多个特定类型的元素,并获取它们的索引。
l = [1, 2, 3, myobj, 4, 5]

我只需循环遍历列表并检查每个元素的类型即可实现此目标:
for i, v in enumerate(l):
  if type(v) == Mytype:
    return i

有更符合Python语言风格的方式来实现相同的结果吗?

您需要该类型所有元素的索引,还是只需要第一个? - BrenBarn
@BrenBarn 在我的特定情况下,我只需要第一个,但是“通用”的解决方案会更受欢迎。 - Nick
你可以使用推导式或生成器表达式,但这意味着你必须遍历整个列表以查看是否至少有一个。在我看来,你的方法更有效率。 - karthikr
如果使用 if is instance(v, Mytype): 会更好,但是否则这看起来也不错。 - jonrsharpe
2个回答

7
你可以使用 next生成器表达式:
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
@Nick - 对不起,我误读了你的问题。请看我的修改。 - user2555451

1
你可以使用列表推导式。
获取所有字符串类型的元素:
b = [x for x in a if isinstance(x,str)]

获取所有字符串类型元素的索引:
b = [x[0] for x in enumerate(a) if isinstance(x[1],str)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接