Как преобразовать списки объектов класса в список их атрибутов - PullRequest
3 голосов
/ 27 июня 2019

ребята! Поэтому я недавно начал изучать классы и объекты Python. Например, у меня есть следующий список строк:

alist = ["Four", "Three", "Five", "One", "Two"]

Что сравнимо с моим классом чисел:

class Numbers(object):
   One=1
   Two=2
   Three=3
   Four=4
   Five=5

Как я могу конвертировать alist в

alist = [4, 3, 5, 1, 2]

на основе класса выше?

Моей первоначальной мыслью было создать новый (пустой) список и использовать for loop, который добавляет соответствующее значение объекта (например, Numbers.One) к пустому списку, когда он проходит через alist. Но я не уверен, будет ли это самым эффективным решением.

Поэтому мне было интересно, есть ли более простой способ выполнить эту задачу, используя Python Classes / Inheritance.

Надеюсь, кто-нибудь сможет мне помочь и объяснить, какой способ будет работать лучше и почему!

Спасибо !!

Ответы [ 4 ]

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

Если вы настроены на использование класса, одним из способов было бы использовать __getattribute__()

print([Numbers().__getattribute__(a) for a in alist])
#[4, 3, 5, 1, 2]

Но гораздо лучшим (и более питонским ИМО) способом было быиспользуйте dict:

NumbersDict = dict(
    One=1,
    Two=2,
    Three=3,
    Four=4,
    Five=5
)
print([NumbersDict[a] for a in alist])
#[4, 3, 5, 1, 2]
2 голосов
/ 27 июня 2019

Большинство объектов (и, следовательно, классов) в python имеют поле __dict__, которое представляет собой отображение имен атрибутов на их значения.Вы можете получить доступ к этому полю с помощью встроенного vars, поэтому

values = [vars(Numbers)[a] for a in alist]

даст вам то, что вы хотите.

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

Хотя я полностью согласен с тем, что использование dict для Numbers будет проще и понятнее, но покажет вам способ Enum, поскольку в вашем классе используются магические числа и своего рода действительный вариант использования перечислений.

Аналогичная реализация с использованием Enum будет:

from enum import Enum

class Numbers(Enum): 
    One = 1 
    Two = 2 
    Three = 3 
    Four = 4 
    Five = 5 

Тогда вы можете использовать getattr и Numbers.<attr>.value, чтобы получить постоянные числа:

In [592]: alist = ["Four", "Three", "Five", "One", "Two"]                                                                                                                                                   

In [593]: [getattr(Numbers, n).value for n in alist]                                                                                                                                                        
Out[593]: [4, 3, 5, 1, 2]

Редактировать на основании комментария:

Если вы хотите получить имена из списка номеров:

In [952]: l = [4, 3, 5, 1, 2]                                                                                                                                                                               

In [953]: [Numbers(num).name for num in l]                                                                                                                                                                  
Out[953]: ['Four', 'Three', 'Five', 'One', 'Two']
0 голосов
/ 27 июня 2019

РЕДАКТИРОВАТЬ: Я полагаю, что слова и цифры являются просто тривиальным примером, словарь является правильным способом сделать это, если это не так, как написано в комментариях.

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

Пустой список с циклом for

#... Numbers class defined above
alist = ["Four", "Three", "Five", "One", "Two"]
nlist = []
numbers = Numbers()
for anumber in alist:
    nlist.append(getattr(numbers, anumber))

print(nlist)
[4, 3, 5, 1, 2]

Понимание списка с помощью цикла for

#... Numbers class defined above
alist = ["Four", "Three", "Five", "One", "Two"]
numbers = Numbers()

nlist = [getattr(numbers, anumber) for anumber in alist]

print(nlist)
[4, 3, 5, 1, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...