2011-11-29 28 views

Trả lời

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

Nếu bạn đang sử dụng python 2.7 hoặc 3.x, bạn có thể sử dụng từ điển hiểu thay thế:

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

Sửa

Như đã đề cập trong các ý kiến ​​của JBernardo, cho python 3.x bạn cần phải sử dụng items thay vì iteritems

+2

'.ititems()' không hợp lệ trên Python 3.x ... – JBernardo

+0

@JBernardo: Cố định nhờ tôi quên mất điều đó – GWW

+0

hiệu chỉnh khác - thực hiện việc đọc từ điển bạn đề nghị '{(y, x) cho x, y trong dic_cols_w.items()} 'trả về một tập, không phải từ điển. Bạn vẫn cần phải bọc nó trong một 'dict (...) 'để lấy từ điển – tsando

4

Hãy thử điều này:

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

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

Sử dụng mã này (trivially sửa đổi) từ câu trả lời được chấp nhận tại Python reverse/invert a mapping:

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

Lưu ý rằng điều này giả định rằng các giá trị trong từ điển gốc là duy nhất. Nếu không, bạn sẽ kết thúc bằng các khóa trùng lặp trong từ điển kết quả và điều đó không được phép.

Và, như @wim chỉ ra, nó cũng giả định các giá trị có thể băm. Xem the Python glossary nếu bạn không chắc chắn những gì là và không phải là hashable.

4

lẽ:

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

+2

điều này có lẽ không an toàn vì nó dựa vào thứ tự khóa và giá trị mặc dù nó đã xảy ra với tôi. Tôi thích (các) câu trả lời của JBernardo/GWW. – aaron

+0

Có lẽ tốt hơn nên sử dụng 'iterkeys' và' itervalues' – GWW

+0

Đó là an toàn nếu dict không thay đổi trong quá trình hoạt động. Tôi thích bởi vì bạn đã làm nó mà không có một sự hiểu biết. – JBernardo

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

Đôi khi, với điều kiện là các giá trị đều là duy nhất sẽ không giữ, trong trường hợp này, câu trả lời ở trên sẽ tiêu diệt bất kỳ giá trị trùng lặp.

Các cuộn sau các giá trị mà có thể là bản sao lên thành một danh sách:

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())]) 

tôi chắc chắn rằng có một phương pháp tốt hơn (không-list-comp), nhưng tôi đã có một vấn đề với các câu trả lời trước đó , vì vậy tôi nghĩ rằng tôi sẽ cung cấp giải pháp của mình trong trường hợp những người khác có trường hợp sử dụng tương tự.

P.S. Đừng mong đợi các dict vẫn sắp xếp gọn gàng sau khi bất kỳ thay đổi nào đối với bản gốc! Phương pháp này là một lần sử dụng chỉ trên một dict tĩnh - bạn đã được cảnh báo!

0

Trước hết là không đảm bảo rằng điều này là có thể, vì các giá trị của từ điển có thể không thể thực hiện được.

Trong trường hợp này không phải là, chúng ta có thể sử dụng một cách tiếp cận chức năng với:

reversed_dict = dict(map(reversed, original_dict.items())) 
Các vấn đề liên quan