我會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'}
來源
2012-03-21 01:04:56
DSM
我假設你的意思是'a'在你的例子中是「原始鍵」。我想指出的是,字典沒有下訂單,「原始鑰匙」只能意味着「第一次遇到」。 – freespace 2012-03-21 01:06:32