我目前有一个列表列表,其中每个列表都包含相同类型的信息,例如:
[['Planet Name', 16, 19, 27, 11], ['Planet Name 2', 12, 22, 11, 42], ....]
我想用一个类把它变成一个具有相同信息的对象列表,其中索引0是self.name,索引1是self.distance,对于每个单独的列表都是如此。
我知道我需要使用某种for循环,但不知道如何去做这件事。
我真的很感激一些帮助,尝试学习Python和目前的课程!
答案 0 :(得分:5)
您可以像这样使用namedtuple来动态创建对象,并使用字段名称列表。此代码中的*item
称为unpacking of arguments list
from collections import namedtuple
Planet = namedtuple("Planet", ["name", "distance", "a", "b", "c"])
data = [['Planet Name', 16, 19, 27, 11],['Planet Name 2', 12, 22, 11, 42]]
for item in data:
planet = Planet(*item)
print planet.name, planet.distance, planet
<强>输出强>
Planet Name 16 Planet(name='Planet Name', distance=16, a=19, b=27, c=11)
Planet Name 2 12 Planet(name='Planet Name 2', distance=12, a=22, b=11, c=42)
注意: namedtuple
是tuple
的子类。因此,使用namedtuple
创建的所有对象都是不可变的。这意味着,一旦创建了对象,就无法更改成员变量中的数据。
答案 1 :(得分:3)
嗯......要创建一个像你想要的课程,你可以做这样的事情:
class Planet(object):
def __init__(self, *args, **kwargs):
self.name = args[0]
self.distance = args[1]
# ... etc ...
或类似的东西:
class Planet(object):
def __init__(self, name, distance, ...):
self.name = name
self.distance = distance
# ... etc ...
然后你这样称呼它:
p = Planet(*['Planet Name', 16, 19, 27, 11])
在一个循环中:
l = [['Planet Name', 16, 19, 27, 11], ['Planet Name 2', 12, 22, 11, 42], ....]
planets = [Planet(*data) for data in l]
答案 2 :(得分:1)
我很困惑。你有没有创建Planet构造函数? 代码类似于:
class Planet(object):
def __init__(self, ....):
....
planets = [['Planet Name', 16, 19, 27, 11]['Planet Name 2', 12, 22, 11, 42]....]
planet_list = [Planet(*p) for p in planets]
答案 3 :(得分:0)
如果您不想拥有一个了解列表细节的构造函数(__init__
),您可以这样做
lists = [['Planet Name', 16, 19, 27, 11], ['Planet Name 2', 12, 22, 11, 42]]
class Planet(object):
pass
for l in lists:
planet = Planet()
setattr(planet, 'name', l[0])
setattr(planet, 'distance', l[1])
setattr(planet, 'size', l[2])
print planet.name, planet.distance, planet.size