Bre*_*dan 43 python arrays iteration
我不记得我是不是在做梦,但我似乎记得有一个功能可以让我这样做,
foo in iter_attr(array of python objects, attribute name)
Run Code Online (Sandbox Code Playgroud)
我查看了文档,但这种事情不属于任何明显列出的标题
Wil*_*ris 41
使用列表推导会构建一个临时列表,如果搜索的序列很大,它可能会占用你所有的内存.即使序列不大,构建列表意味着在in
开始搜索之前迭代整个序列.
通过使用生成器表达式可以避免临时列表:
foo = 12
foo in (obj.id for obj in bar)
Run Code Online (Sandbox Code Playgroud)
现在,只要obj.id == 12
接近开始bar
,搜索就会很快,即使bar
是无限长.
正如@Matt建议的那样,hasattr
如果任何一个对象bar
都缺少一个id
属性,那么使用它是个好主意:
foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 12
您是否希望获得具有特定属性的对象列表?如果是这样,列表理解是正确的方法.
result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
Run Code Online (Sandbox Code Playgroud)
dwe*_*ook 10
你总是可以自己写一个:
def iterattr(iterator, attributename):
for obj in iterator:
yield getattr(obj, attributename)
Run Code Online (Sandbox Code Playgroud)
将适用于迭代的任何东西,无论是元组,列表还是其他什么.
我喜欢python,它使得这样的东西变得非常简单,并且不再是必要的麻烦,并且在使用中这样的东西非常优雅.
不,你不是在做梦.Python有一个非常优秀的列表理解系统,可以让你非常优雅地操作列表,并且根据你想要完成的内容,这可以通过几种方式完成.从本质上讲,您正在做的是"如果标准匹配项列表中的项目",那么您可以只是遍历结果或将结果转储到新列表中.
我将在这里给Dive Into Python做一个例子,因为它非常优雅,而且比我更聪明.在这里,他们获取目录中的文件列表,然后过滤列表以查找与正则表达式条件匹配的所有文件.
Run Code Online (Sandbox Code Playgroud)files = os.listdir(path) test = re.compile("test\.py$", re.IGNORECASE) files = [f for f in files if test.search(f)]
对于您的示例,您可以在没有正则表达式的情况下执行此操作,对于您的结尾处的表达式为匹配返回true的任何内容.还有其他选项,比如使用filter()函数,但如果我要选择,我会选择这个.
Eric Sipple
您正在考虑的功能可能是operator.attrgettter
.例如,要获取包含每个对象的"id"属性值的列表:
import operator
ids = map(operator.attrgetter("id"), bar)
Run Code Online (Sandbox Code Playgroud)
如果你想检查列表是否包含id == 12的对象,那么一个整洁有效(即不会不必要地迭代整个列表)的方法是:
any(obj.id == 12 for obj in bar)
Run Code Online (Sandbox Code Playgroud)
如果你想在attrgetter中使用'in',同时仍然保留列表的延迟迭代:
import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)
我想到的可以使用列表推导来实现,但我认为有一个功能以稍微更简洁的方式做到了这一点.
即'bar'是一个对象列表,所有对象都具有属性'id'
神话般的功能方式:
foo = 12
foo in iter_attr(bar, 'id')
Run Code Online (Sandbox Code Playgroud)
列表理解方式:
foo = 12
foo in [obj.id for obj in bar]
Run Code Online (Sandbox Code Playgroud)
回想起来,无论如何,列表理解方式非常简洁.
归档时间: |
|
查看次数: |
10289 次 |
最近记录: |