如何在没有for循环的情况下访问列表中类的属性

2024-04-16 20:04:20 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在没有for循环的情况下访问列表中类的属性?我一直在创建列表,循环使用它们效率很低,所以我尽量避免使用干净的代码。你知道吗

杀了你_循环.py你知道吗

# Define our arbitrary class
class IntRelationships(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.diff = abs(b-a)
    def add(self):
        return self.a + self.b

# create a class list
relationship_list = [ IntRelationships(1,2), IntRelationships(2,4), IntRelationships(4, 8)]

# How I currently access attributes in list
large_diff_list = []
for relationship in relationship_list:
    if relationship.diff > 1:
        large_diff_list.append(relationship)

# How imagine one could do it without a loop and array initialisation
large_diff_list2 = relationship_list[ relationship_list[:].diff > 1 ]

Tags: inself列表for属性def情况diff
2条回答

您可以使用list comprehension

large_diff_list = [r for r in relationship_list if r.diff > 1]

实际上,访问n项上的属性所需的计算量并没有任何问题—您需要以某种方式对所有n项进行循环。但是,如果您担心如何高效地使用内存的话,您可能可以使用生成器而不是列出一个列表。生成器只在需要时创建下一个元素,因此不必一次将所有内容存储在内存中。缺点是,您不再可以随意访问这些项目。因此,如果您只想在生成器上执行for循环,而不想在特定位置重复访问项,那么这是有意义的。当然,可以通过调用list(my_generator)将生成器转换为列表。你知道吗

large_diff_generator = filter(lambda relationship: relationship.diff > 1, relationship_list)

编辑:我错误地认为从filter返回的值是一个生成器。它是一个iterable,与生成器一样,它不预先计算每个值,而是根据需要一次计算一个值。您可以按以下方式进行验证:

from typing import Generator, Iterable
evens = filter(lambda x: x % 2 == 0, range(100000000000000000000000000000))
isinstance(evens, Generator)  # False
isinstance(evens, Iterable)  # True

相关问题 更多 >