Comment le groupe une liste de tuples/objets similaires index/attribut en python?
Donné une liste
old_list = [obj_1, obj_2, obj_3, ...]
Je veux créer une liste:
new_list = [[obj_1, obj_2], [obj_3], ...]
où obj_1.some_attr == obj_2.some_attr
.
J'ai pu jeter un peu de for
boucles et if
vérifie ensemble, mais c'est laid. Est-il un pythonic moyen pour cela? par ailleurs, les attributs de l'objet sont toutes les chaînes.
Sinon, une solution pour une liste contenant les tuples (de même longueur) au lieu des objets est apprécié, trop.
- "une liste contenant les tuples (de même longueur) au lieu des objets" est-ce à dire que une liste qui contient tous les tuples de la même longueur ? Si oui, quel est le "attribut" sur laquelle les tuples sont-ils regroupés ? - BTW, les tuples sont des objets, n'est-ce pas ?
- 1. Oui; 2. les tuples sont regroupés à un certain indice. L'élément à l'indice est une chaîne de caractères.; 3. Je crois que oui,... mais je n'en suis pas certaine. 🙂
InformationsquelleAutor Aufwind | 2011-07-06
Vous devez vous connecter pour publier un commentaire.
defaultdict
est comment c'est fait.Tout
for
boucles sont largement essentiel,if
déclarations ne sont pas.dict
avec leitertools.groupby
réponses, vous n'avez même pas besoin d'utiliserdefaultdict
.list(groups.values())
à renvoyer en fait ce que l'OP veut? Je veux dire, sinon, si on appellenew_list[0]
, elle obtientTypeError: 'dict_values' object does not support indexing
(à leats sur ma machine).Voici deux cas. Les deux nécessitent les importations suivantes:
Vous serez en utilisant itertools.groupby et soit de l'opérateur.attrgetter ou de l'opérateur.itemgetter.
Pour une situation où vous êtes regroupement par
obj_1.some_attr == obj_2.some_attr
:Pour
a[some_index] == b[some_index]
:Notez que vous devez le tri parce que
itertools.groupby
fait un nouveau groupe lorsque la valeur de la clé de changements.Notez que vous pouvez utiliser pour créer un
dict
comme S. Lott réponse, mais ne pas avoir à utilisercollections.defaultdict
.À l'aide d'un dictionnaire, la compréhension (ne fonctionne qu'avec Python 3+, et éventuellement de Python 2.7, mais je ne suis pas sûr):
Pour les précédentes versions de Python, ou comme une nouvelle alternative:
Pense que vous pouvez également essayer d'utiliser itertools.groupby. Veuillez noter que le code ci-dessous est juste un exemple et doit être modifiée en fonction de vos besoins:
groupby
.