2011-11-29 18 views

Odpowiedz

48
my_dict2 = dict((y,x) for x,y in my_dict.iteritems()) 

Jeśli używasz Pythona 2.7 lub 3.x, możesz zamiast tego użyć słownika:

my_dict2 = {y:x for x,y in my_dict.iteritems()} 

Edit

Jak zauważył w komentarzach przez JBernardo dla Pythona 3.x trzeba użyć items zamiast iteritems

+2

'.iteritems()' nie jest poprawna w Pythonie 3.x ... – JBernardo

+0

@JBernardo: Naprawiono dzięki, że zapomniałem o tej – GWW

+0

kolejnej korekcie - w zrozumieniu słownika sugerujesz '{(y, x) dla x, y in dic_cols_w.items()} 'zwraca zestaw, a nie słownik. Nadal będziesz musiał zawinąć to w 'dict (...) ', aby uzyskać słownik – tsando

4

Spróbuj tego:

my_dict = {2:3, 5:6, 8:9} 

new_dict = {} 
for k, v in my_dict.items(): 
    new_dict[v] = k 
6

użyć tego kodu (trywialnie zmodyfikowane) z zaakceptowanej odpowiedzi pod numerem Python reverse/invert a mapping:

dict((v,k) for k, v in my_dict.iteritems()) 

Należy pamiętać, że zakłada to, że wartości w oryginalnym słowniku są unikalne. W przeciwnym razie skończyłoby się zduplikowane klucze w wynikowym słowniku, a to nie jest dozwolone.

I, jak wskazuje @wim, zakłada również, że wartości są nieosiągalne. Jeśli nie masz pewności, co jest i nie jest ulepszalne, zobacz the Python glossary.

4

może:

flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))

+2

prawdopodobnie nie jest to bezpieczne, ponieważ opiera się na uporządkowaniu klucza i wartości, mimo że zadziałało to dla mnie. Podoba mi się odpowiedź (odpowiedzi) JBernardo/GWW. – aaron

+0

Lepiej jest używać 'iterkeys' i' itervalues' – GWW

+0

To bezpieczne, jeśli dyktat nie zostanie zmieniony podczas operacji. Lubiłem, bo robiłeś to bez zrozumienia. – JBernardo

1
my_dict = { my_dict[k]:k for k in my_dict} 
2

Czasami, pod warunkiem, że wartości są unikalne nie odbędzie, w tym przypadku, odpowiedzi powyżej zniszczy wszelkie duplikaty wartości.

Poniższy bułki wartości, które mogą być duplikatami się na listę:

from itertools import count 
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())]) 

Jestem pewien, że istnieje lepszy sposób (non-lista-comp), ale miałem problem z wcześniejszymi odpowiedziami , więc myślałem, że dostarczę swoje rozwiązanie, na wypadek gdyby inni mieli podobny przypadek.

P.S. Nie oczekuj, że dyktat pozostanie uporządkowany po każdej zmianie oryginału! Ta metoda jest jednorazowym użyciem tylko w statycznym dict - zostałeś ostrzeżony!

0

Przede wszystkim jest to nie gwarantowane, że jest to możliwe, ponieważ wartości słownika mogą być nieodczepiane.

W przypadku te nie są, możemy użyć funkcjonalne podejście:

reversed_dict = dict(map(reversed, original_dict.items())) 
Powiązane problemy