Хранение объектов в списке в Python - PullRequest
0 голосов
/ 14 июня 2019

Если объект существует с переменной .X

randomData.X 

это созданный объект. Если несколько объектов хранятся в списке и доступны через

randomList[3].X

Есть ли способ извлечь все значения X из списка без циклического прохождения всех объектов в списке, как показано ниже:

for x i range(0,10)
randomList[x].X

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Вы, вероятно, ищете понимание списка.

[obj.X for obj in randomList]

Это создает список со всеми свойствами X каждого объекта в вашем списке объектов.

Имейте в виду, что вы не можете избежать циклического перебора списка. Это просто синтаксический сахар для того же цикла, что и раньше.

1 голос
/ 14 июня 2019

На всякий случай, если вам нужна максимальная эффективность при больших list с, альтернативой пониманию list в этом случае является использование map + operator.attrgetter. Вы можете зациклить map напрямую:

from operator import attrgetter

for X in map(attrgetter('X'), randomList):

, который не требует временных list (map лениво извлекает элементы по требованию в Python 3), или, если вам действительно нужен list, просто оберните в конструктор list или используйте распаковку list для запуска это с нетерпением:

Xs = list(map(attrgetter('X'), randomList))
# or
Xs = [*map(attrgetter('X'), randomList)]

Для небольших входных данных list с, это будет медленнее, чем понимание list (у него немного больше накладных расходов на настройку), но для средних и больших входов это будет быстрее (накладные расходы на элемент немного ниже, поскольку не требует выполнения байт-кода для каждого элемента).

Для ясности, все равно придется перебирать list. Не существует волшебного способа получить атрибуты каждого элемента в list без зацикливания на нем; вы могли бы пойти на крайние меры, чтобы получить представления list, которые беспрепятственно читают атрибут из базового list, но если бы вы обращались к каждому элементу этого представления, это было бы эквивалентно требуемому циклу в работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...