我有一个列表,可以包含几个不同类型的元素。 我需要检查在这个列表中是否有一个或多个特定类型的元素并获得它的索引。
l = [1, 2, 3, myobj, 4, 5]
我可以通过简单地遍历我的列表并检查每个元素的类型来实现这个目标:
for i, v in enumerate(l):
if type(v) == Mytype:
return i
是否有更多的pythonic方式来实现相同的结果?
答案 0 :(得分:6)
您可以使用next
和generator 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
。
答案 1 :(得分:0)
您可以使用列表理解。
获取字符串类型的所有元素:
b = [x for x in a if isinstance(x,str)]
获取string类型元素的所有索引:
b = [x[0] for x in enumerate(a) if isinstance(x[1],str)]