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