将列表列表转换为对象

时间:2013-11-19 08:11:34

标签: python list class

我目前有一个列表列表,其中每个列表都包含相同类型的信息,例如:

[['Planet Name', 16, 19, 27, 11], ['Planet Name 2', 12, 22, 11, 42], ....]

我想用一个类把它变成一个具有相同信息的对象列表,其中索引0是self.name,索引1是self.distance,对于每个单独的列表都是如此。

我知道我需要使用某种for循环,但不知道如何去做这件事。

我真的很感激一些帮助,尝试学习Python和目前的课程!

4 个答案:

答案 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)

注意: namedtupletuple的子类。因此,使用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