在数组中使用'in'匹配Python对象的属性
我不太记得我是不是在做梦,但我好像记得有一个函数可以做类似这样的事情,
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 == 12
在 bar
的开头附近,查找就会很快,即使 bar
是无限长的。
正如 @Matt 所建议的,如果 bar
中的任何对象可能缺少 id
属性,使用 hasattr
是个好主意:
foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))