Je suis nouveau sur Python. J'ai une liste d'objets, chaque objet est une instance d'une classe et a 5 valeurs chacun. J'ai besoin de trier la liste en fonction de deux valeurs. c'est-à-dire prénom et nom. Comment puis je faire ça? Ou existe-t-il une meilleure façon de réaliser ce que je fais?

Existe-t-il également un moyen de lister tous les objets de cette liste au format json après le tri?

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)
0
redAlert 19 juil. 2015 à 04:39

4 réponses

Meilleure réponse

Pour le tri, vous pouvez utiliser la fonction sorted() avec l'argument key comme -

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

De plus, si par format json, vous voulez dire quelque chose comme -

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

Un tel dictionnaire pour chaque objet. Vous pouvez ensuite créer une fonction qui renvoie l'attribut __dict__ de l'objet et utiliser json.dumps et map comme -

def cdict(a):
    return a.__dict__

s = json.dumps(list(map(cdict,<your list>)))
print(s)
0
Anand S Kumar 19 juil. 2015 à 02:53

J'aime utiliser operator.attrgetter pour faire un peu les choses plus descriptif / lisible

import operator
last_then_first = operator.attrgetter('lastname', 'firstname')
entries.sort(key = last_then_first)
0
wwii 19 juil. 2015 à 05:45

Si vous souhaitez utiliser la réponse de Kremlan, ajoutez ce qui suit à votre classe:

    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
blasko 19 juil. 2015 à 02:09
sorted = sorted(alist, key=lambda x: (x['firstname'], x['lastname']))
0
Kremlan 19 juil. 2015 à 01:52