2015-07-09 4 views
-1

У меня есть словарь под названием г, который выглядит, как этотключи флип и значения в словаре питона


{0: [0,28209479177387814, 0,19947114020071635, +0,10377687435514868, 0,07338133158686996], -1: [0.28209479177387814, 0.19947114020071635, 0.10377687435514868 , 0.07338133158686996]}.

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

{0,28209479177387814: 0, 0,19947114020071635: 0, 0,10377687435514868: 0, +0,07338133158686996: 0, 0,28209479177387814: -1, 0,19947114020071635: -1, +0,10377687435514868: -1 , +0,07338133158686996: -1}

кусок кода, который, кажется, работает это:

for a in z: 
    newdict=dict.fromkeys(z[a],a) 

, но он работает только для одного из ключей в г и возвращает это:

{0,28209479177387814: -1, +0,07338133158686996: -1, 0,10377687435514868: -1, 0,19947114020071635: -1}

, что я делаю неправильно?

+6

ключи должны быть отличным, извините. – NightShadeQueen

+0

Подумайте, что бы это означало, чтобы задать желаемый инвертированный словарь для значения 'z [0.28209479177387814]'. Какую ценность он вам даст? '0' или' -1'? –

+0

Прошу прощения, я не понимаю. Что вы имеете в виду? 0 отличается от -1, не так ли? – kiprin629

ответ

1

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

from itertools import product, chain 

tuples = chain.from_iterable(product(vs, [k]) for k, vs in orig_dict.items()) 
# note this is identical to: 
# # tuples = [] 
# # for k, vs in orig_dict.items(): 
# #  for tup in [(v, k) for v in vs]: 
# #   tuples.append(tup) 

Это будет производить:

[(0.28209479177387814, 0), (0.19947114020071635, 0), 
(0.10377687435514868, 0), (0.07338133158686996, 0), 
(0.28209479177387814, -1), (0.19947114020071635, -1), 
(0.10377687435514868, -1), (0.07338133158686996, -1)] 

Теперь, если вы действительно хотите что-то интересное, вы можете сортировать, что и группа вместе.

from itertools import groupby 

groups = groupby(sorted(tuples), key=lambda kv: kv[0]) 

Это создает что-то вроде:

[(0.07338133158686996, [(0.07338133158686996, 0, 
         0.07338133158686996, -1]), 
... ] 

Вы могли бы бросить тех, в Словаре, выполнив:

final_dict = {k: [v[1] for v in vs] for k, vs in groups} 

Который должен, наконец, дать:

{0.07338133158686996: [0, -1], 
... } 
+0

Я думаю, что первая часть - это то, что я хочу, но когда я пытаюсь выполнить код, он возвращает «itertools.chain object at 0x10db527d0» вместо того, что вы показали – kiprin629

+0

@ kiprin629, потому что он возвращает генератор, значения которого указаны выше. Если вам действительно нужен список для чего-то (и помните, что я * ОЧЕНЬ МНОГО * сомневаюсь, что вы это делаете), вы можете сделать 'tuples = list (chain.from_iterable (...))' –

+0

Я избегал использования списки здесь. Следующий шаг 'groupby' также создает генератор (генераторов). Использование списков, когда вы просто пытаетесь преобразовать данные, тратит много памяти, в зависимости от того, насколько большой ваш набор данных. –

3

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

Это может быть исправлено, имеющей параллельной структурой для первый, поэтому вместо {value:key} было бы {value:[key1, key2]}. Код для его создания будет следующим:

new = {} 
for key, value in z.items(): 
    if not value in new: 
    new[value] = [] 
    new[value].append(key) 

См. Ответ Адама Смита для получения более подробной информации.

+0

Или вы можете быть ленивым и использовать collection.defaultdict со значением по умолчанию 'list': P – NightShadeQueen

+0

@NightShadeQueen или вы можете быть ленивым и использовать' new.setdefault (value, []). Append (key) ':) –

+0

I как и код, который вы предложили; однако я хотел бы сгруппировать каждый элемент в списках значений с помощью ключа, чтобы сделать набор точек данных – kiprin629

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