从对象数组中打印对象属性的数组

3

我有一个Node类,其中包含一些属性

然后我有一个Node对象的数组

nodes = [
    Node(some attributes),
    Node(some attributes),
    Node(some attributes),
]

我希望你能做这样的事情。
for i, node in enumerate(nodes):
    arr[i] = node.attribute

print(arr)

通过输入类似以下的内容
print(nodes.attribute)

或者
print([nodes].attribute)

或者
print(nodes[*].attribute)

等等,然后让它返回类似于

print(nodes) 

但是使用特定属性而不是返回对象

我对Python还比较新手,这似乎比遍历数组容易。

有吗?


2
print([n.attribute for n in nodes]) - jordanm
1
顺便提一下,@jordanm评论中的语法被称为“列表推导式”,如果您想了解更多,请阅读相关资料。 - John Gordon
1个回答

6

这并不容易,因为在Python中方括号定义了一个列表,而不是一个数组。列表不会强制要求您在整个列表中具有相同类型的元素(在您的情况下是Node)。

您有一些选项:

遍历列表

与您在问题中所做的相同。

attributes = []
for node in nodes:
     attributes.append(node.attr)

列表生成式

相比之前的方法,更符合 Python 风格的语法。

attributes = [node.attr for node in nodes]

在此列表上映射函数

这需要您定义一个函数,该函数接收一个节点并返回该节点的属性。

def get_attr(node)
    return node.attr

# or alternatively:
get_attr = lambda node: node.attr

attributes = map(getattr, nodes)

将这个函数向量化并将数组作为参数传递

这可能是你想要做的最接近的方法。它需要两件事情:将之前的函数向量化和将nodes转换为一个数组。

import numpy as np
get_attr_vec = np.vectorize(get_attr)
nodes = np.array(nodes)

attributes = get_attr_vec(nodes)

要重现此示例,首先需要定义节点列表:
class Node:
    def __init__(self, a):
        self.attr = a

n1 = Node(1)
n2 = Node(2)
n3 = Node(3)

nodes = [n1, n2, n3]

另外,您可以使用内置函数getattr代替点语法。

# These two are the same thing:
a = node.attr
a = getattr(node, 'attr')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接