Wie man ein verschachteltes dictionary und dynamisch Daten Anhängen
Ich habe eine Schleife, dass Sie mir drei Variablen
matteGroup
matteName
object
Ich würde gerne eine verschachtelte dicionary halten alle Daten wie:
dictionary{matteGroup: {matteName: obj1, obj2, ob3} }
Checke ich die Objekte eins nach dem anderen, so möchte ich die matteGroup
wenn es nicht vorhanden ist, erstellen Sie die matteName
wenn es nicht exixst und dann erstellen oder fügen Sie den Namen des Objekts.
Ich habe versucht, eine Menge der Lösung, wie die normalen Wörterbücher, defaultdict und einige benutzerdefinierte Klassen, die ich im Netz gefunden, aber ich habe nicht in der Lage, es richtig zu machen. Ich habe eine schöne Verschachtelung kann ich nicht Anhängen, oder Umgekehrt.
Dies ist die loop -
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)
mit diesem bekomme ich die beiden Wörterbüchern getrennt, aber die ist nicht so sinnvoll!
Irgendein Tip???
Dank
InformationsquelleAutor nookie | 2012-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
probieren Sie etwas wie dieses
InformationsquelleAutor bpgergo
Vorausgesetzt ich habe verstanden, Ihre Anforderungen richtig:
InformationsquelleAutor NPE
Blick auf die
defaultdict
imcollections
Modul.Hier ist ein einfaches Beispiel, das sieht aus wie was Sie ' re geht für:
Also, sollten Sie brauchen nur dieses:
InformationsquelleAutor eduffy
wenn die Geschwindigkeit ist ein Anliegen, das Sie verwenden könnten, try-except-Klauseln, die nur versuchen, füllen Sie zuerst Ihre Daten, anstatt die Prüfung, ob Elemente existieren, und dann, indem es jedes mal durch die Schleife
für den ersten try/außer, es wäre das beste, zu setzen, was Ausnahme maya wirft, wenn ein attr nicht existiert, auf einem Knoten (nicht maya öffnen, gerade jetzt, so ich konnte nicht legte,...). Dies ist im wesentlichen Prüfungen für die attr und geht weiter zum nächsten obj, wenn der attr gibt es nicht. Sie können Sie sowohl in es, anstatt jeweils Ihre eigenen try/except, denn es sollte Fehler, wenn Sie entweder nicht existiert sowieso.
zweiten try/except ist zu überprüfen, ob die matteGroup ist in der oberste Ebene in Ihrem dict. Wenn nicht, dann wissen Sie das matteName und Liste von obj ist nicht in Ihrem Daten-Struktur, so dass es fügt Sie hinzu und geht weiter zum nächsten obj
Dritten try/außer versucht, anfügen obj-die matteName dict-Element auf der Liste. Wenn Sie eine keyError hier, es bedeutet, dass die matteName nicht in Ihrem matteGroup dict, so dass es dann fügt es und erstellt die Liste mit den aktuellen obj als erstes Element in die Liste ein.
Also, So weit wie Geschwindigkeit betrifft, jeder Zeit Elemente vorhanden sind, die in Ihrem Daten-Struktur, die nächsten obj, die Sie hinzufügen, um das Daten-Element wird im wesentlichen nur Hinzugefügt, ohne zu testen, ob alle anderen Daten-Struktur ist im Platz, bevor Sie es, so dass die Schleife schneller gehen, der weiter in den loop gehen (vorausgesetzt, es gibt eine Menge von Knoten teilen matteGroups und/oder matteNames)
InformationsquelleAutor silent_sight
Aufgrund eines Problems mit Beizen mein Objekt, dass einige der bisherigen Antworten, ich habe versucht, dies zu lösen, als gut. Das ist was für mich gearbeitet für das dynamische hinzufügen von neuen Schlüsseln zu zwei verschiedenen sub-Ebenen der Wörterbücher:
Diese Lösung scheint nur in der Lage, um zwei Ebenen verschachteln.
InformationsquelleAutor John Behm