bigbossfr a écrit :
De plus, c'est pas possible sans parcourir tout les elements ? Avec des sets ou autres..
Cest que je peux en avoir 10 000...
|
Ben tu sais, même si tu utilises des méthodes poussées comme des itertools il y aura quand-même parsing (même si c'est l'itertools qui le fait en caché !!!)
Déjà ce premier code permet d'extraire les objets
Code :
o=[] for v in allGroups.values(): o+=v
|
J'ai essayé d'éviter la boucle en passant par un reduce mais j'ai pas réussi. Quoi qu'il en soit, en fin de boucle tu as tous tes objets dans "o" (avec les redondances mais tu peux les supprimer par un set)
Ensuite cette seconde itération te crée un dico par objet
Code :
all={} for x in set(o): if x not in all.keys(): all[x]=[] for (k, v) in allGroups.items(): if x in v: all[x].append(k)
|
En fin d'itération, tu as all={'object1': ['property1', 'property2', 'property4'], 'object2': ['property1', 'property2', 'property3'], 'object3': ['property1', 'property3'], 'object4': ['property1', 'property2', 'property3']} (tout comme le code de philippe06)
Ensuite j'ai tenté de créer un dico en partant de "all" mais en inversant "k" et "v" de cette façon
Code :
result={} for (k, v) in all.items(): if v not in result.keys(): result[v]=[] result[v].append(k)
|
Ce qui aurait donné result= { ["property1", "property2", "property4"]:["object1"], ["property1", "property2", "property3"]:["object2", "object4"]} comme tu le veux mais il semble qu'en python2.6 (ma version) on ne puisse pas créer de dico où la clef serait une liste comme me l'a montré l'essai suivant
Code :
result={ [1, 2, 3] : "toto"}
|
et où j'ai eu la réponse "TypeError: list objects are unhashable"
Donc voilà. Peut-être qu'en python3 on peut faire mais quoi qu'il en soit, tu ne pourras pas éviter de parser ton objet. Tout ce que tu peux faire sera d'éviter les parsing inutiles ou redondants...