2015-07-19 4 views
0

Я новичок в Python. У меня есть список объектов, каждый объект является экземпляром класса и имеет по 5 значений. Мне нужно отсортировать список на основе двух значений. т.е. имя и фамилия. Как я могу это сделать? Или есть лучший способ достичь того, что я делаю?Как отсортировать список экземпляров класса (объектов) на основе нескольких значений объектов в Python

Также есть способ перечислить все объекты этого списка в формате json после сортировки?

class Format1(): 
    def __init__(self, alist): 
     self.color = alist[3] 
     self.firstname = alist[1] 
     self.lastname = alist[0] 
     self.phonenumber = alist[2] 
     self.zipcode = alist[4] 

obj = Format1(alist) 
entries.append(obj) 
+1

Можете ли вы показать свой код? –

+0

OBJ = формат 1 (ассоциативный список) entries.append (OBJ) класс формат 1(): \t Защиту __init __ (я, ассоциативный список): \t \t self.color = ALIST [3] \t \t self.firstname = ALIST [1] \t \t self.lastname = ALIST [0] \t \t self.phonenumber = ALIST [2] \t \t self.zipcode = ALIST [4] Так я создаю несколько объектов с использованием указанного класса и добавления объекты в списке. – redAlert

+0

Не могли бы вы [изменить] ваш вопрос включить код? – NightShadeQueen

ответ

0

Для сортировки, Вы можете использовать sorted() функцию с key аргумента как -

sortedlist = sorted(alist, key=lambda x: (x.firstname , x.lastname)) 

Кроме того, если форматом JSON, вы имеете в виду что-то вроде -

{'color':'<colorname>', 'firstname','<firstname>' ....} 

Такой словарь для каждого объекта. Тогда вы можете создать функцию, которая возвращает атрибут объекта __dict__ и использовать json.dumps и map как -

def cdict(a): 
    return a.__dict__ 

s = json.dumps(list(map(cdict,<your list>))) 
print(s) 
0
sorted = sorted(alist, key=lambda x: (x['firstname'], x['lastname'])) 
+0

Вы предполагаете, что он реализовал метод __getitem__. Он не хранит эти данные в json, поэтому этот код не будет работать для того, что он в настоящее время имеет, по коду. – blasko

+0

Правда. Получение ошибки __getitem__ при использовании вышеуказанного метода – redAlert

0

Если вы хотите использовать ответ Kremlan, добавьте следующую строку в ваш класс:

def __getitem__(self, option): 
     return {"color": self.color, 
       "firstname": self.firstname, 
       "lastname": self.lastname 
       "phonenumber": self.phonenumber 
       "zipcode": self.zipcode 
     }.get(option.lower(), None) 
0

Мне нравится использовать operator.attrgetter, чтобы сделать что-то более наглядным/удобочитаемым

import operator 
last_then_first = operator.attrgetter('lastname', 'firstname') 
entries.sort(key = last_then_first) 
Смежные вопросы