2016-01-26 2 views
1

У меня есть словарь:словарь Fliping ключевое значение Python

d = {0: 0, 1: 1, 2: 2, 3: 3, 4: 0, 5: 1, 6: 2, 7: 2, 8: 0, 9: 4, 10: 2, 11: 4, 12: 1, 13: 2, 14: 2, 15: 4, 16: 2} 

Я хотел бы, чтобы подсчитать количество каждого значения появляются в словаре: т.е.

new_d_count = {0:3, 1:3, 2:7, ...} 

Я также хотел бы " flip "это так, что каждое значение будет ключевым, а значение этого нового ключа будет ключом исходного списка. т.е:

new_d = {0:(0,4,8), 1:(1,5,12), 2:(2,6,7,10,13,14,16) .....} 
+4

Похоже, у вас есть четкое представление о том, что вы хотите сделать. Что вы пробовали/какая у вас проблема? – Holloway

ответ

4

Используйте Counter для первой задачи:

from collections import Counter 
>>> Counter(d.values()) 
Counter({2: 7, 0: 3, 1: 3, 4: 3, 3: 1}) 

используйте устройство defaultdict для второй задачи:

>>> from collections import defaultdict 
>>> new_d = defaultdict(tuple) 
>>> for k,v in d.items(): 
...  new_d[v] += (k,) 
... 
>>> new_d 
defaultdict(<type 'tuple'>, {0: (0, 4, 8), 1: (1, 5, 12), 2: (2, 6, 7, 10, 13, 14, 16), 3: (3,), 4: (9, 11, 15)}) 

В качестве альтернативы, без defaultdict:

>>> new_d = {} 
>>> for k,v in d.items(): 
...  new_d[v] = new_d.get(v, tuple()) + (k,) 
... 
>>> new_d 
{0: (0, 4, 8), 1: (1, 5, 12), 2: (2, 6, 7, 10, 13, 14, 16), 3: (3,), 4: (9, 11, 15)} 

Наконец, если вы на самом деле не нужны значения быть кортежи, сделать это следующим образом:

>>> new_d = {} 
>>> for k,v in d.items(): 
...  new_d.setdefault(v, []).append(k) 
... 
>>> new_d 
{0: [0, 4, 8], 1: [1, 5, 12], 2: [2, 6, 7, 10, 13, 14, 16], 3: [3], 4: [9, 11, 15]} 
+0

Отлично! Благодаря ! – matlabit

+0

@matlabit проблем нет, я добавил еще один вариант. – timgeb

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