按类型在列表中查找项目
我有一个列表,这个列表里可以放很多不同类型的元素。现在我需要检查一下,这个列表里是否有一个或多个特定类型的元素,并且想知道它们的位置。
l = [1, 2, 3, myobj, 4, 5]
我可以通过简单地遍历这个列表,检查每个元素的类型来实现这个目标:
for i, v in enumerate(l):
if type(v) == Mytype:
return i
有没有更符合Python风格的方法来达到同样的效果呢?
2 个回答
1
你可以使用列表推导式。
获取所有字符串类型的元素:
b = [x for x in a if isinstance(x,str)]
获取所有字符串类型元素的索引:
b = [x[0] for x in enumerate(a) if isinstance(x[1],str)]
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
。