2010-10-05 7 views
2

Chaque exemple d'utilisation de liste ou d'ensemble dans Python semble inclure des cas triviaux d'entiers mais j'ai deux listes d'objets où l'attribut name définit si deux instances d'objets sont "identiques" ou non (les autres attributs peuvent avoir des valeurs différentes).Combinaison de deux listes d'objets basés sur un attribut

Je peux créer une liste qui contient tous les éléments des deux listes, triées, avec

tmpList = sorted(list1 + list2, key=attrgetter('name')) 

mais comment dois-je faire la même sorte que les éléments de la liste qui ont la même valeur dans l'attribut name sont choisis parmi la deuxième liste?

Par exemple, la combinaison de ces deux listes

list1 = [obj('Harry',18), obj('Mary',27), obj('Tim', 7)] 
list2 = [obj('Harry', 22), obj('Mary', 27), obj('Frank', 40)] 

entraînerait

list = [obj('Harry',22), obj('Mary', 27), obj('Tim', 7), obj('Frank', 40)] 

(j'ai utilisé obj() comme notation sténographique pour un objet qui a deux attributs.)

Il semble que je ne puisse pas utiliser la fonction attrgetter() dans la plupart des fonctions set et list comme je le peux avec la fonction sorted(), donc je ne peux pas comprendre comment je suis censé faire cela. Je suppose que je pourrais utiliser une fonction lambda, mais je ne connais pas trop la programmation fonctionnelle, donc je ne parviens pas à la comprendre. La solution naïve (d'abord choisir tous les éléments uniques dans les deux listes, puis combiner cette liste avec ce qui reste de la deuxième liste) semble assez longue, il doit donc y avoir un moyen plus simple en Python.

+0

Pourquoi ne pas utiliser un dictionnaire? – JoshD

Répondre

4

Semble à moi comme vous pourriez être mieux avec un dict au lieu d'une liste, en utilisant le nom comme clé, et le reste de l'objet en valeur. Ensuite, vous pouvez simplement dict1.update(dict2).

>>> dict1 = {"Harry": 18, "Mary": 27, "Tim": 7} 
>>> dict2 = {"Harry": 22, "Mary": 27, "Frank": 40} 
>>> dict1.update(dict2) 
>>> dict1 
{'Tim': 7, 'Harry': 22, 'Frank': 40, 'Mary': 27} 
+0

OK, merci, maintenant ça marche! J'ai essayé de faire fonctionner ça toute la matinée, donc c'était une aide précieuse! – Makis

1

Oui. La manière facile est un dictionnaire.

list1 = {"Harry": 18, "Mary": 27, "Tim": 7} 
list2 = {"Harry": 22, "Mary": 27, "Frank": 40} 

list1.update(list2) 

liste est maintenant {'Harry':22, 'Mary': 27, 'Tim': 7, 'Frank': 40}

Si vos données sont plus qu'un simple numéro, c'est OK. Vous pouvez mettre n'importe quel type d'objet comme valeur pour un dictionnaire.

list1['Harry'] = (1,"weee",54.55) 
+0

J'ai accepté la réponse de Tim parce qu'elle était très légèrement plus compréhensible grâce au premier paragraphe, mais merci pour votre réponse. – Makis

0

Vous pouvez implémenter l'attribut de __eq__ dans votre objet. Sur cette base, vous pouvez comparer vos objets avec l'opérateur ==.

Questions connexes