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

Translate

我不记得我是否在做梦,但我似乎还记得有一个函数可以执行以下操作:

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

我看了看文档,但是这种事情不会落在任何明显列出的标题下

This question and all comments follow the "Attribution Required."

所有的回答

Translate

使用列表推导会建立一个临时列表,如果要搜索的序列很大,则该列表可能会占用您的所有内存。即使序列不大,构建列表也意味着对之前的整个序列进行迭代in可以开始搜索。

通过使用生成器表达式可以避免使用临时列表:

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

现在,只要obj.id == 12即将开始bar,即使bar无限长。

正如@Matt建议的那样,使用它是一个好主意hasattr如果有任何物体bar可能会丢失id属性:

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

您是否正在寻找具有特定属性的对象列表?如果是这样,清单理解是正确的方法。

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
来源
Translate

您总是可以自己写一个:

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

可以处理任何迭代的内容,无论是元组,列表还是其他。

我喜欢python,它使诸如此类的东西变得非常简单,并且没有不必要的麻烦,并且在使用中,诸如此类的东西非常优雅。

来源
Translate

不,你不是在做梦。 Python有一个非常出色的列表理解系统,它使您可以优雅地操作列表,并且根据要完成的工作,可以通过两种方法来完成。从本质上讲,您正在说的是“对于符合条件的列表中的项目”,然后您就可以遍历结果或将结果转储到新列表中。

我要从一个例子深入Python在这里,因为它非常优雅,而且比我聪明。他们在这里获取目录中的文件列表,然后过滤匹配正则表达式条件的所有文件的列表。

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

例如,您可以在不使用正则表达式的情况下执行此操作,例如对于任何表达式在结尾处返回true进行匹配的情况。还有其他一些选项,例如使用filter()函数,但是如果我要选择的话,我会选择它。

埃里克·西普尔

来源
Translate

您正在考虑的功能可能是operator.attrgettter。例如,要获取一个包含每个对象的“ id”属性值的列表:

import operator
ids = map(operator.attrgetter("id"), bar)

如果要检查列表是否包含id == 12的对象,那么一种简洁有效的方法(即,不必不必要地遍历整个列表)是:

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

如果要在attrgetter中使用'in',同时仍然保留列表的延迟迭代:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

来源
Translate

我所想的可以通过列表理解来实现,但是我认为有一个函数可以稍微整洁地完成此任务。

即'bar'是对象列表,所有对象均具有'id'属性

神话般的功能方式:

foo = 12
foo in iter_attr(bar, 'id')

清单理解方式:

foo = 12
foo in [obj.id for obj in bar]

回想起来,列表理解方式还是很简洁的。

来源
Translate

如果您打算搜索任何大小合适的东西,那么最好的选择是使用字典或集合。否则,您基本上必须遍历迭代器的每个元素,直到获得所需的元素为止。

如果这不一定是对性能敏感的代码,则列表理解方法应该起作用。但是请注意,它效率很低,因为它遍历了迭代器的每个元素,然后再次遍历迭代器,直到找到所需的内容为止。

请记住,python具有最高效的哈希算法之一。利用它来发挥您的优势。

来源
Translate

我认为:

#!/bin/python
bar in dict(Foo)

是您的想法。当试图查看python字典(哈希表的python版本)中的某个字典中是否存在某个键时,有两种检查方法。首先是has_key()字典附带的方法,第二个是上面给出的示例。它将返回一个布尔值。

那应该回答你的问题。

现在,将话题与清单理解先前给出的答案(更加清晰)。清单理解从基本构造列表for循环与修饰符。作为示例(略作澄清),一种使用in dict语言构造清单理解:

假设您有一个二维词典foo而且您只想要包含键的第二维字典bar。相对简单的方法是使用清单理解条件如下:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

注意if bar in value在语句**的末尾,这是一个修改子句,它告诉清单理解只保留那些符合条件的键值对。**在这种情况下baz是一本新字典,其中仅包含foo包含bar的字典(希望我在该代码示例中没有任何遗漏……您可能必须看一看清单中的列表理解文档)docs.python.org教程secnetix.de,如果将来有疑问,这两个站点都是不错的参考。)

来源
上一个问题:
php -加密密码 Encrypting