Il s'agit d'une question algorithmique-logique (comment le faire), question de la mise en œuvre partielle (comment le faire mieux!). Je travaille avec Django, alors j'ai pensé partager ça avec ça. En Python, le problème est quelque peu lié à how-do-i-use-pythons-itertoolsgroupby.Django/Python - Regrouper des objets par ensemble commun d'une relation plusieurs-à-plusieurs
Supposons que vous avez donné deux classes dérivées modèle Django:
from django.db import models
class Car(models.Model):
mods = models.ManyToManyField(Representative)
et
from django.db import models
class Mods(models.Model):
...
Comment peut-on obtenir une liste des voitures, regroupées par voitures avec un ensemble commun de Mods?
I.e. Je veux obtenir un likeso de classe:
Cars_by_common_mods = [
{ mods: { 'a' }, cars: { 'W1', 'W2' } },
{ mods: { 'a', 'b' }, cars: { 'X1', 'X2', 'X3' }, },
{ mods: { 'b' }, cars: { 'Y1', 'Y2' } },
{ mods: { 'a', 'b', 'c' }, cars: { 'Z1' } },
]
J'ai pensé à quelque chose comme:
def cars_by_common_mods():
cars = Cars.objects.all()
mod_list = []
for car in cars:
mod_list.append({ 'car': car, 'mods': list(car.mods.all()) }
ret = []
for key, mods_group in groupby(list(mods), lambda x: set(x.mods)):
ret.append(mods_group)
return ret
Cependant, cela ne fonctionne pas parce que (peut-être entre autres) la groupby ne semblent se regrouper par les ensembles de mods. Je suppose que le mod_list doit être trié pour fonctionner avec groupby. Tout ça pour dire, je suis confiant qu'il y a quelque chose de simple et d'élégant qui sera à la fois éclairant et éclairant.
Salutations & merci!
Merci pour la réponse. J'ai regardé regrouper, mais le problème (non déclaré) est qu'il y a plus de logique à faire après les groupements initiaux. C'est un bon conseil, cependant; verra si je peux le concevoir autour de regrouper. –