Витягнути список атрибутів зі списку об'єктів у python


81

У мене є єдиний список об'єктів у python:

class myClass(object):
    def __init__(self, attr):
        self.attr = attr
        self.other = None

objs = [myClass (i) for i in range(10)]

Тепер я хочу витягти список з деяким атрибутом цього класу (скажімо attr), щоб передати його таким чином якусь функцію (наприклад, для побудови цих даних)

Який пітонічний спосіб це зробити,

attr=[o.attr for o in objsm]

?

Можливо, вивести список і додати до нього метод, щоб я міг використати якусь ідіому типу

objs.getattribute("attr")

?


1
Див. Копію stackoverflow.com/q/677656/127465 , esp. відповідь оператором
.attrgetter

Відповіді:


80

Ви також можете написати:

attr=(o.attr for o in objsm)

Таким чином ви отримуєте генератор, який зберігає пам’ять. Для отримання додаткових переваг зверніться до Generator Expressions .


чи буде доступ до конкретного результату введення операції O (n) ?. наприклад, якщо доступ до index = 100 з attr [100] призведе до того, що генератор виконає 100 кроків?
Ханан Штейнгарт,

85

attrs = [o.attr for o in objs]був правильним кодом для складання списку, подібного до того, який ви описуєте. Не намагайтеся підклас listдля цього. Чи є щось, що вам не сподобалось у цьому фрагменті?


2
Тільки що це занадто багатослівно, і я буду використовувати його часто, тому ярлик буде дуже до речі. Структуровані масиви numpy arr ['colname'] або перевизначає arr.colname, вже надають щось подібне, але в цьому випадку я використовую об'єкти, що містять іменовані дані (і деякі функції).
franjesus

Якщо це ваш намір, getOattr= lambda l,a: [getattr(i,a) for i in l] щоб ви могли getOattr(l,'id')або getOattr(l,'name') . Якщо вам потрібні більш конкретні дані, то, getIds= lambda l,a: [i.id for i in l]щоб ви моглиgetIds(l)
user2390183
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.