Nói rằng tôi có một cuốn từ điển như vậy:chuyển phím và các giá trị trong một từ điển trong python
my_dict = {2:3, 5:6, 8:9}
Có cách nào mà tôi có thể chuyển đổi các khóa và giá trị để có được:
{3:2, 6:5, 9:8}
Nói rằng tôi có một cuốn từ điển như vậy:chuyển phím và các giá trị trong một từ điển trong python
my_dict = {2:3, 5:6, 8:9}
Có cách nào mà tôi có thể chuyển đổi các khóa và giá trị để có được:
{3:2, 6:5, 9:8}
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
'.ititems()' không hợp lệ trên Python 3.x ... – JBernardo
@JBernardo: Cố định nhờ tôi quên mất điều đó – GWW
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
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
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.
lẽ:
flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))
đ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
Có lẽ tốt hơn nên sử dụng 'iterkeys' và' itervalues' – GWW
Đó 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
my_dict = { my_dict[k]:k for k in my_dict}
Đô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!
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()))
là những giá trị độc đáo? Các giá trị có thể băm không? – wim