Comment faire un imbriquée dictionnaire et dynamiquement ajouter des données
J'ai une boucle de me donner trois variables
matteGroup
matteName
object
Je voudrais faire un imbriquée dicionary la tenue de toutes les données comme:
dictionary{matteGroup: {matteName: obj1, obj2, ob3} }
Je vérifie les objets un par un, donc je voudrais créer le matteGroup
si elle n'existe pas, créez le matteName
si ce n'est pas exixst et puis créer ou ajouter le nom de l'objet.
J'ai essayé beaucoup de solution comme normal dictionnaires, defaultdict et quelques classes personnalisées que j'ai trouvé sur le net, mais je n'ai pas été capable de le faire correctement. J'ai une belle nidification je ne suis pas en mesure d'ajouter, ou vice versa.
C'est la boucle
dizGroup = {}
dizName = {}
for obj in mc.ls(type='transform'):
if mc.objExists(obj + ('.matteGroup')):
matteGroup = mc.getAttr(obj + ('.matteGroup'))
matteName = mc.getAttr(obj + ('.matteName'))
if matteGroup not in dizGroup:
dizGroup[matteGroup] = list()
dizGroup[matteGroup].append(matteName)
if matteName not in dizName:
dizName[matteName] = list()
dizName[matteName].append(obj)
avec cela je reçois les deux dictionnaires séparément, mais n'est pas très utile!
Tout soupçon?
Grâce
OriginalL'auteur nookie | 2012-01-09
Vous devez vous connecter pour publier un commentaire.
essayer quelque chose comme cela
OriginalL'auteur bpgergo
À condition que je l'ai bien compris vos besoins correctement:
OriginalL'auteur NPE
Regarder la
defaultdict
dans lecollections
module.Voici un exemple simple qui ressemble à ce que vous allez pour:
Donc, vous devez juste besoin de ce:
OriginalL'auteur eduffy
si la vitesse est un problème, vous pourriez utiliser try/except clauses de simplement essayer de remplir vos données, plutôt que de vérifier si les éléments existent, puis en ajoutant à chaque fois à travers la boucle
pour la première try/except, il serait préférable de mettre ce que l'exception maya lance si un attribut n'existe pas sur un nœud (n'ont pas maya ouvrir droit maintenant, donc je ne pouvais pas mettre ça...). Essentiellement, cela vérifie l'attr et continue à la prochaine obj si l'attribut n'est pas là. Vous pouvez les mettre à la fois dans les il y au lieu de ayant chacun leur propre try/except, car il doit d'erreur si l'un n'existe pas de toute façon.
la deuxième try/except est de vérifier si la matteGroup est dans le haut niveau de votre dict. Si ce n'est pas le cas, alors vous savez que la matteName et de la liste des obj n'est pas dans votre structure de données, de sorte qu'il ajoute et qui continue à la prochaine obj
la troisième try/except essaie d'ajouter le fichier à la matteName dict élément de la liste. Si vous obtenez un keyError ici, cela signifie que le matteName n'est pas dans votre matteGroup dict, de sorte qu'il ajoute ensuite et crée la liste avec le courant obj que le premier élément de cette liste.
Donc, tant que la vitesse est concerné, à tout moment, les éléments existent dans la structure de données, le prochain obj-vous ajouter d'élément de données sera essentiellement juste ajouté, sans avoir à tester si toutes les autres données de la structure est en place avant de l'ajouter, ce qui rend votre boucle d'aller plus vite, le plus loin dans la boucle de vous rendre (à condition qu'il existe beaucoup de noeuds partageant matteGroups et/ou matteNames)
OriginalL'auteur silent_sight
En raison d'un problème avec le décapage de mon objet, que certaines réponses précédentes, j'ai essayé de résoudre ce ainsi. C'est ce qui a fonctionné pour moi pour ajouter dynamiquement de nouvelles clefs pour deux sous niveaux de dictionnaires:
Cette solution semble être la seule capable de gérer deux niveaux d'imbrication.
OriginalL'auteur John Behm