Распечатать массив атрибутов объекта из массива объектов - PullRequest
1 голос
/ 23 марта 2020

У меня есть класс 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)

et c.

, а затем верните что-нибудь как

print(nodes) 

, но с атрибутом Speci c вместо возврата объектов

Я немного новичок в python, и кажется, что это должно быть проще, чем перебирать массив.

есть?

1 Ответ

1 голос
/ 23 марта 2020

Это не так просто, потому что в 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...