2015-09-10 1 views
0

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

Можно ли добавить к значениям в новом словаре, если ключ повторяется, используя понимание?

Вход:

test_di = {'a':'1', 'b':'2', 'c':'3', 'd':'2'} 

Код:

{v:k for k,v in test_di.items()} 

Выход этого кода:

{'1': 'a', '3': 'c', '2': 'd'} 

Желаемый результат:

{'1': ['a'], '3': ['c'], '2': ['c','d']} 
+0

Что вы имеете в виду под 'реверс'? В Python словари неупорядочены. –

+0

Я думаю, он хочет поменять клавиши на значения и значения для ключей. Затем он будет использовать ключ для поиска последнего назначенного значения для этого ключа? –

+0

Можете ли вы отредактировать свой вопрос, по крайней мере, включить примерный словарь для ввода и желаемый результат, а в идеале - понимание словаря, которое вы пробовали? –

ответ

0

Ваш вопрос запутан, но похоже, что вы хотите хранить несколько значений в одном ключе в словаре.

Это невозможно, вы можете захотеть сохранить словарь списков.

7

Невозможно сделать это разумным способом (то есть O(N) раз) со пониманием словаря. Понимание просто не может обрабатывать дублированные значения.

Однако, это довольно легко с обычной петлей:

d = {} 
for key, value in old_d.items(): 
    d.setdefault(value, []).append(key) 
+0

Очень элегантный. Благодарю. По какой-то причине я не думаю, что когда-либо использовал 'setdefault' –

0

Вы можете использовать OrderedDict и обратный ключи. Обычный dict не отслеживает порядок ключей.

from collections import OrderedDict 

dict1 = OrderedDict([('Name', 'Jon'), ('Race', 'Latino'), ('Job', 'Nurse')]) 
reversed_dict1 = OrderedDict([(key, dict1.get(key)) for key in reversed(dict1)]) 
0

defaultdict будет наиболее эффективным подходом:

from collections import defaultdict 

test_di = {'a':'1', 'b':'2', 'c':'3', 'd':'2'} 

d = defaultdict(list) 
for v,k in test_di.items(): 
    d[k].append(v) 

print(d)