如何将类对象列表转换为其属性列表

时间:2019-06-27 16:01:37

标签: python class inheritance

伙计们!因此,我最近开始学习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类/继承完成此任务的更简单方法。

我希望有人能帮助我并向我解释哪种方法会更好,为什么呢!

谢谢!

4 个答案:

答案 0 :(得分:3)

如果您打算使用该类,一种方法是使用__getattribute__()

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

但是更好的方法(也是更Python化的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]

答案 1 :(得分:2)

python中的大多数对象(以及类)都具有__dict__字段,该字段是从属性名称到其值的映射。您可以使用内置的vars访问此字段,因此

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

会给您您想要的东西。

答案 2 :(得分:1)

虽然我完全同意,将dict用于Numbers会更容易和直接,但是向您展示Enum的方式,因为您的课程涉及魔术数字和某种有效的用法枚举的情况。

使用Enum的类似实现为:

from enum import Enum

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

然后,您可以使用getattrNumbers.<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']

答案 3 :(得分:0)

编辑:我想单词和数字只是一个简单的例子,如果不是注释中写的那样,那么字典是正确的方法。

您的假设是正确的-创建一个空列表并使用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]