Ребята ! Поэтому я недавно начал изучать классы и объекты 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.

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

Спасибо!!

3
Rikk 27 Июн 2019 в 19:01

4 ответа

Лучший ответ

Хотя я полностью согласен с тем, что использование 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']
1
heemayl 29 Июн 2019 в 09:44

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

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

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

2
georg 27 Июн 2019 в 16:36

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

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

Но гораздо лучшим (и более питонным IMO) способом было бы использовать 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]
3
pault 27 Июн 2019 в 16:10

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

Ваши предположения верны - либо создайте пустой список и заполните его циклом 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]
0
user10417531user10417531 27 Июн 2019 в 16:08