2012-03-21 5 views
5

私はPython辞書を使用してMayaで重複シェーダを削除する方法を見つけようとしています。辞書から重複値を抽出する

を私はキーとして辞書にすべてのMayaシェーダを入れて、値として対応するテクスチャファイルを入れたい:ここ

は私がやっているものです。次に、スクリプトを辞書に通して同じ値を共有するキーを見つけて、配列や別の辞書に入れる。

これは私が今持っているものは基本的である:

shaders_dict = {'a': somePath, 'b': somePath, 
       'c': differentPath, 'd': differentPath} 

duplicate_shaders_dict = {}` 

どのように私は今、このようになります別の辞書をコンパイルすることの辞書を介して実行することができます

duplicate_shaders_dict = {'b':somePath, 'd':differentPath } 

そしてトリッキーな部分ビーイング重複があるので、私はスクリプトをskip the original keyにしたいので、シェイダー辞書を複製するために詰め込まれることもありません。

+3

私はあなたの例では「a」を意味します。私は辞書が順序付けされていないことを指摘したいと思います、そして、 "元の鍵"は "最初に遭遇した"ことを意味するだけです。 – freespace

答えて

3

単純な解決策の1つは、辞書を逆にすることです。与えられた:

>>> d = {'a': 'somePath', 'b': 'somePath', 
... 'c': 'differentPath', 'd': 'differentPath'} 

あなたはこのようにそれを逆にすることができます

>>> r 
{'differentPath': 'd', 'somePath': 'b'} 

そして、あなたは、あなたが重複してオリジナルの辞書が削除されていること、逆場合:

あなたに与え

>>> r = dict((v,k) for k,v in d.iteritems()) 

>>> d = dict((v,k) for k,v in r.iteritems()) 
>>> d 
{'b': 'somePath', 'd': 'differentPath'} 
+0

と重複した値を持つdictはどこですか? – juliomalegria

+0

ああ、その部分を逃した。これは、質問の「私が持っているもの」の部分から始まり、「私が欲しいもの」という部分を生み出すので、おそらく始めるのに適しています。 – larsks

+0

これは理にかなっていますが、私は重複を取り除きたくないので、別の変数に入れてから、後で自分の行動を取り、シーンから削除する必要があります。 –

4

私はpr明らかにこのようなことをしてください。

>>> from collections import defaultdict 
>>> 
>>> shaders_dict = {'a':'somePath', 'b':'somePath', 'c':'differentPath', 'd':'differentPath'} 
>>> 
>>> inverse_dict = defaultdict(list) 
>>> for k,v in shaders_dict.iteritems(): 
...  inverse_dict[v].append(k) 
... 
>>> inverse_dict 
defaultdict(<type 'list'>, {'differentPath': ['c', 'd'], 'somePath': ['a', 'b']}) 

これは、基本的にすべてのキー、値のペアをループし、値に関連付けられたリストにキーを追加して辞書を反転:まず、逆辞書を作ります。

>>> first_shaders_dict = {} 
>>> duplicate_shaders_dict = {} 
>>> for v, ks in inverse_dict.iteritems(): 
...  first, rest = ks[0], ks[1:] 
...  first_shaders_dict[first] = v 
...  for r in rest: 
...   duplicate_shaders_dict[r] = v 
... 
>>> first_shaders_dict 
{'a': 'somePath', 'c': 'differentPath'} 
>>> duplicate_shaders_dict 
{'b': 'somePath', 'd': 'differentPath'} 

うーん:

はその後、これを分割します。これは、テクスチャファイルがハッシュ可能であることを前提としているので、辞書キーとして機能することができます。もしそうでなければ、それを回避しなければならないだろう。また、@freespaceの注釈としてここには順序がないので、特定の順序が必要な場合は、ソートされたキーなどを反復処理する必要があります。

-

更新:私は上記をあまり好きではありませんでした。より短いitertoolsベースのバージョン:

>>> import itertools 
>>> shaders_dict = {'a':'somePath', 'b':'somePath', 'c':'differentPath', 'd':'differentPath'} 
>>> keys = sorted(sorted(shaders_dict),key=shaders_dict.get) 
>>> by_val = [(v, list(ks)) for v, ks in itertools.groupby(keys, shaders_dict.get)] 
>>> first_dict = dict((ks[0],v) for v,ks in by_val) 
>>> duplicate_dict = dict((k,v) for v,ks in by_val for k in ks[1:]) 
>>> first_dict 
{'a': 'somePath', 'c': 'differentPath'} 
>>> duplicate_dict 
{'b': 'somePath', 'd': 'differentPath'} 
+0

これはそれをやった!それは私には「魔法」のようなものですが。私はこの解決策を検討するつもりです。 –

+0

+1の更新... –