伙计们!因此,我最近开始学习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类/继承完成此任务的更简单方法。
我希望有人能帮助我并向我解释哪种方法会更好,为什么呢!
谢谢!
答案 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
然后,您可以使用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']
答案 3 :(得分:0)
编辑:我想单词和数字只是一个简单的例子,如果不是注释中写的那样,那么字典是正确的方法。
您的假设是正确的-创建一个空列表并使用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]
#... 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]