2012-03-21 4 views
5

Я пытаюсь найти способ удаления дублирующих шейдеров в Maya с использованием Python Dictionaries.Извлечь дублирующиеся значения из словаря

Вот что я делаю:

Я хочу поставить все Майя шейдеры в словарь в качестве ключей и поместить соответствующий файл текстуры в качестве значения. Затем я хочу, чтобы скрипт запускался через словарь и находил любые ключи, которые имеют одно и то же значение и помещают их в массив или другой словарь.

Это в основном то, что я прямо сейчас:

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

Одним из простых решений является обратный словарь. Дано:

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

Вы можете отменить его, как это:

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

Что дает:

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

И если вы реверс, что у вас есть исходный словарь с дубликатами удалены:

>>> 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 для обновления ... –

Смежные вопросы