2013-11-19 3 views
2

Я в настоящее время есть список списков, где каждый список состоит из того же рода информации, говорят:Включение списка списков в объекты

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

, и я хотел бы использовать класс, чтобы сделать это в список объектов с той же информацией, где индекс 0 является self.name, индекс 1 является self.distance и т. д. для каждого отдельного списка.

Я знаю, что мне нужно использовать какой-то цикл for, но не знаю, как это сделать и сделать это.

Я бы очень признателен за помощь, пытаясь изучить Python и в настоящее время классы!

+0

Пожалуйста, уточните: «где index 0 - self.name, index 1 - self.distance и т. Д.« Каковы имена полей, которые вы хотите? –

ответ

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] 
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, неизменяемы. Это означает, что после создания объекта данные в переменных-членах не могут быть изменены.

+0

Мне нравится этот ответ, но он должен прийти с заявлением о том, что namedtuples неизменяемы. – jbat100

+0

@ jbat100 Хорошая точка. В ответ добавлена ​​заметка. Благодаря :) – thefourtheye

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] 
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 
Смежные вопросы