从字典中提取重复值

2024-10-01 07:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python字典找到在Maya中删除重复着色器的方法。在

我要做的是:

我希望将所有maya着色器作为关键帧放入词典,并将相应的纹理文件作为值。然后我希望脚本在字典中运行,找到共享相同值的任何键,并将它们填充到数组或其他字典中。在

这就是我现在的基本情况:

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

duplicate_shaders_dict = {}`

现在,我如何运行该字典来编译另一个类似这样的词典:

^{pr2}$

还有一个棘手的问题是,由于存在重复项,我希望脚本skip the original key,这样它就不会被塞进重复着色器字典。在


Tags: 文件方法脚本字典情况数组dict词典
2条回答

我可能会做这样的事。首先,制作逆字典:

>>> 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']})

这基本上是通过循环每个键、值对并将键附加到与值相关联的列表中来反转字典。在

然后把这个分开:

^{pr2}$

嗯。这假设纹理文件是散列的,因此可以作为字典键。如果他们没有,那我就得解决这个问题。另外,由于@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'}

一个简单的解决方法是颠倒字典。给予:

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

可以这样反转:

^{pr2}$

这给了你:

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

如果你把它颠倒过来,原来的字典就去掉了重复的部分:

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

相关问题 更多 >