Gib*_*bus 4 python arrays class object
我有一个带有一些属性的 Node 类
然后我有一个 Node 对象数组
nodes = [
Node(some attributes),
Node(some attributes),
Node(some attributes),
]
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情
for i, node in enumerate(nodes):
arr[i] = node.attribute
print(arr)
Run Code Online (Sandbox Code Playgroud)
通过输入类似的内容
print(nodes.attribute)
Run Code Online (Sandbox Code Playgroud)
或者
print([nodes].attribute)
Run Code Online (Sandbox Code Playgroud)
或者
print(nodes[*].attribute)
Run Code Online (Sandbox Code Playgroud)
ETC。
然后让它返回类似的东西
print(nodes)
Run Code Online (Sandbox Code Playgroud)
但使用特定属性而不是返回对象
我对 python 有点陌生,看起来这应该比迭代数组更容易。
有没有?
这并不容易,因为在 python 中,方括号定义了一个列表,而不是一个数组。列表不会强制您Node
在整个列表中使用相同类型的元素(在您的情况下)。
您有一些选择:
你在问题中做了同样的事情。
attributes = []
for node in nodes:
attributes.append(node.attr)
Run Code Online (Sandbox Code Playgroud)
之前的语法更加Pythonic。
attributes = [node.attr for node in nodes]
Run Code Online (Sandbox Code Playgroud)
这需要您定义一个函数来接收节点并返回该节点的属性。
def get_attr(node)
return node.attr
# or alternatively:
get_attr = lambda node: node.attr
attributes = map(getattr, nodes)
Run Code Online (Sandbox Code Playgroud)
这可能是最接近您想要做的事情。它需要两件事:向量化前一个函数并转换nodes
为数组。
import numpy as np
get_attr_vec = np.vectorize(get_attr)
nodes = np.array(nodes)
attributes = get_attr_vec(nodes)
Run Code Online (Sandbox Code Playgroud)
要重现此示例,您需要首先定义节点列表:
class Node:
def __init__(self, a):
self.attr = a
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
nodes = [n1, n2, n3]
Run Code Online (Sandbox Code Playgroud)
您也可以使用内置函数getattr
代替点语法。
# These two are the same thing:
a = node.attr
a = getattr(node, 'attr')
Run Code Online (Sandbox Code Playgroud)