在数组中使用'in'匹配Python对象的属性

58 投票
8 回答
15131 浏览
提问于 2025-04-11 00:12

我不太记得我是不是在做梦,但我好像记得有一个函数可以做类似这样的事情,

foo in iter_attr(array of python objects, attribute name)

我查过文档,但这种东西似乎没有在任何明显的分类下列出来。

8 个回答

10

你总是可以自己写一个:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

这个代码可以和任何可以循环的东西一起使用,不管是元组、列表还是其他的。

我喜欢Python,它让这些事情变得非常简单,不会比必要的麻烦多,而且在使用的时候,这种写法非常优雅。

12

你想要获取一组具有特定属性的对象吗?如果是的话,使用列表推导式是最合适的方法。

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
49

使用列表推导式会创建一个临时的列表,如果你要查找的序列很大,这可能会占用你所有的内存。即使序列不大,创建这个列表也意味着在 in 开始查找之前,得先遍历整个序列。

为了避免这个临时列表,可以使用生成器表达式:

foo = 12
foo in (obj.id for obj in bar)

现在,只要 obj.id == 12bar 的开头附近,查找就会很快,即使 bar 是无限长的。

正如 @Matt 所建议的,如果 bar 中的任何对象可能缺少 id 属性,使用 hasattr 是个好主意:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))

撰写回答