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

2024-04-20 09:54:37 发布

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

我有一个带有一些属性的节点类

然后我有一个节点对象数组

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有点陌生,看起来这应该比遍历数组更容易

有吗


Tags: 对象innodefor属性节点attributesome
1条回答
网友
1楼 · 发布于 2024-04-20 09:54:37

这并不容易,因为在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')

相关问题 更多 >