Это не так просто, потому что в python квадратные скобки определяют список , а не массив. Список не заставляет вас иметь один и тот же тип элемента (в вашем случае Node
) по всему списку.
Некоторые опции у вас есть:
Итерация по списку
То же, что вы сделали в вопросе.
attributes = []
for node in nodes:
attributes.append(node.attr)
Понимание списка
Более синтаксис pythoni c для предыдущего.
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')