5

私は3つの変数を与えるループを持っています

matteGroup
matteName
object

次のようなすべてのデータを保持するネストされた辞書を作成したいと思います。

dictionary{matteGroup: {matteName: obj1, obj2, ob3} }

オブジェクトを1つずつチェックしているので、matteGroup存在しない場合は作成し、存在しない場合は作成しmatteName、オブジェクトの名前を作成または追加します。通常の辞書、defaultdict、ネットで見つけたいくつかのカスタムクラスなど、多くの解決策を試しましたが、適切に実行できませんでした。追加できない素敵なネスティングがあります。またはその逆もあります。

これがループです

    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)

これで2つの辞書を別々に取得できますが、あまり役に立ちません! ヒントはありますか?

ありがとう

4

5 に答える 5

7

私があなたの要件を正しく理解していれば:

In [25]: from collections import defaultdict

In [26]: d = defaultdict(lambda: defaultdict(list))

In [30]: for group, name, obj in [('g1','n1','o1'),('g1','n2','o2'),('g1','n1','o3'),('g2','n1','o4')]:
   ....:     d[group][name].append(obj)
于 2012-01-09T13:52:40.563 に答える
4

このようなことを試してください

dizGroup = {}

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] = {}

        if matteName not in dizGroup[matteGroup]:
            dizGroup[matteGroup][matteName] = []

        dizGroup[matteGroup][matteName].append(obj)
于 2012-01-09T13:50:26.863 に答える
2

モジュールdefaultdict内の を見てください。collections

これは、あなたがしようとしているもののように見える簡単な例です:

>>> from collections import defaultdict
>>> dizGroup = defaultdict(lambda:defaultdict(list))
>>> dizGroup['group1']['name1'].append(1)
>>> dizGroup['group1']['name1'].append(2)
>>> dizGroup['group1']['name1'].append(3)
>>> dizGroup['group1']['name2'].append(4)
>>> dizGroup['group1']['name2'].append(5)
>>> dizGroup['group2']['name1'].append(6)
>>> dizGroup
defaultdict(<function <lambda> at 0x7ffcb5ace9b0>, {'group1': defaultdict(<type 'list'>, {'name2': [4, 5], 'name1': [1, 2, 3]}), 'group2': defaultdict(<type 'list'>, {'name1': [6]})})

したがって、これが必要なだけです:

if mc.objExists(obj + ('.matteGroup')):
   matteGroup = mc.getAttr(obj + ('.matteGroup'))
   matteName = mc.getAttr(obj + ('.matteName'))
   dizGroup[matteGroup][matteName].append(obj)
于 2012-01-09T13:53:26.970 に答える