我不记得我是否在做梦,但我似乎记得有一个功能可以实现类似的功能,

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

我已经查看了文档,但这种事情不属于任何明显列出的标题

有帮助吗?

解决方案

使用列表理解会构建一个临时列表,如果要搜索的序列很大,它可能会耗尽您的所有内存。即使序列不大,构建列表也意味着迭代之前的整个序列 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'))

其他提示

您是否想要获取具有特定属性的对象列表?如果是这样,一个 列表理解 是执行此操作的正确方法。

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

你总是可以自己写一个:

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

可以处理任何迭代的东西,无论是元组、列表还是其他什么。

我喜欢Python,它使这样的东西变得非常简单,没有必要的麻烦,而且在使用中这样的东西非常优雅。

不,你不是在做梦。Python 有一个非常优秀的列表理解系统,可以让您非常优雅地操作列表,并且根据您想要完成的具体任务,可以通过几种方式来完成。本质上,您所做的就是说“For item in list if criteria.matches”,然后您可以迭代结果或将结果转储到新列表中。

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

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

对于您的示例,您可以在不使用正则表达式的情况下执行此操作,对于最后的表达式返回 true 匹配的任何内容。还有其他选项,例如使用 filter() 函数,但如果我要选择,我会选择这个。

埃里克·西普尔

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

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

如果你想检查列表中是否包含一个 id == 12 的对象,那么一个简洁高效的方法(即不会不必要地迭代整个列表)方法是:

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

如果您想将 'in' 与 attrgetter 一起使用,同时仍保留列表的惰性迭代:

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

我的想法可以使用列表理解来实现,但我认为有一个函数可以以稍微更简洁的方式完成此操作。

IE。'bar' 是对象列表,所有对象都具有属性 'id'

神话般的功能方式:

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

列表理解方式:

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

回想起来,列表理解方式无论如何都非常简洁。

如果您打算搜索任何相当大的东西,最好的选择是使用字典或集合。否则,您基本上必须遍历迭代器的每个元素,直到找到您想要的元素。

如果这不一定是性能敏感的代码,那么列表理解方式应该可以工作。但请注意,它的效率相当低,因为它会遍历迭代器的每个元素,然后再次返回,直到找到它想要的内容。

请记住,Python 拥有最有效的哈希算法之一。利用它来发挥你的优势。

我认为:

#!/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, ,如果您将来有疑问,这两个网站都是很好的参考。)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top