2015-11-08 2 views
3

У меня есть defaultdict (list), где мои ключи имеют тип tuple, а мои значения - это список кортежей. Я хочу обратить этот словарь и я уже пробовал использовать функцию почтового индекса, и это не работаетРеверсирование по умолчанию dict

Образец моего словарного состава ниже

{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 

Есть в любом случае, чтобы изменить это так что я получаю ключи и значения в обратном направлении

+1

* [Вы не можете использовать списки в качестве ключей, так как списки могут быть изменены на месте индексных назначений, срезу] (https://docs.python.org/ 2/tutorial/datastructures.html # словари) * –

+2

Также следует предупредить, что va у вас есть дубликаты, если вы вворачиваете словарь, это может привести к потере данных. – vonPetrushev

ответ

2

Вы не можете этого сделать, поскольку ваши значения изменяемы: [('Canada', 'Trudeau'),('Obama', 'USA')] - это список, и он не может быть ключом в словаре. Может быть, вы можете изменить это в первую очередь?

1

, если я не недоразумение, что вы имеете в виду под «реверс» (замена ключей для значений, и наоборот):

You can’t use lists as keys, since lists can be modified in place using index assignments, slice assignments, or methods like append() and extend().

NB: Как предполагают другие ответы, если вы накладываете ваши списки к некоторому неизменяемому типу, вы можете использовать их как ключи в dict.

7

Поскольку у вас есть список списков, вам необходимо сделать список неизменяемым типом, который будет использоваться в качестве ключа в питоне Python.

Вы можете сделать список значений кортежей:

>>> di={(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 
>>> {tuple(v):k for k, v in di.items()} 
{(('Canada', 'Trudeau'), ('Obama', 'USA')): (2, '-', 3)} 

Или превратить их в строки:

>>> {repr(v):k for k, v in di.items()} 
{"[('Canada', 'Trudeau'), ('Obama', 'USA')]": (2, '-', 3)} 

С либо, вы можете повернуть ключ обратно в список, если это необходимо:

>>> from ast import literal_eval 
>>> literal_eval("[('Canada', 'Trudeau'), ('Obama', 'USA')]") 
[('Canada', 'Trudeau'), ('Obama', 'USA')] 

>>> list((('Canada', 'Trudeau'), ('Obama', 'USA'))) 
[('Canada', 'Trudeau'), ('Obama', 'USA')] 

(BTW: Не используйте eval, если код, который может иметь какие-либо внешние строки, - используйте.в производстве код, как и в примере здесь)

Наконец, рассмотрим этот Dict:

di={'key 1':'val', 'key 2': 'val', 'key 3': 'val'} 

При обратном ключи и значения, которые вы потеряете данные, так как каждый ключ добавляется «Вал».

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

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

>>> dd 
defaultdict(<type 'list'>, {'val': ['key 1', 'key 2', 'key 3']}) 
0

Если вы имеете в виду для каждого кортежа из списка, чтобы быть ключом, то это довольно просто (это не имеет значения, D является dict или defaultdict здесь)

>>> D = {(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 
>>> {k1: k for k, v in D.items() for k1 in v} 
{('Canada', 'Trudeau'): (2, '-', 3), ('Obama', 'USA'): (2, '-', 3)} 
Смежные вопросы