TL; DR
Sử dụng hiểu từ điển, như thế này
>>> my_map = { 'a': ['b', 'c'], 'd': ['e', 'f'] }
>>> {value: key for key in my_map for value in my_map[key]}
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Các hiểu từ điển thấy ở trên có chức năng tương đương với cấu trúc vòng lặp sau đó populates một từ điển rỗng
>>> inv_map = {}
>>> for key in my_map:
... for value in my_map[key]:
... inv_map[value] = key
...
>>> inv_map
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Lưu ý: Sử dụngmap
bóng được xây dựng trong map
chức năng. Vì vậy, không sử dụng nó như một tên biến trừ khi bạn biết những gì bạn đang làm.
cách tương tự khác cũng làm như vậy
Python 3.x
Bạn có thể sử dụng dict.items
, như thế này
>>> {value: key for key, values in my_map.items() for value in values}
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Chúng tôi sử dụng phương pháp items()
đây, mà sẽ tạo ra một đối tượng xem từ từ điển wh ich sẽ cung cấp cho các cặp khóa giá trị khi lặp lại. Vì vậy, chúng tôi chỉ lặp lại nó và xây dựng một từ điển mới với ánh xạ ngược.
Python 2.x
Bạn có thể sử dụng dict.iteritems
như thế này
>>> {value: key for key, values in my_map.iteritems() for value in values}
{'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'}
Chúng tôi không thích items()
phương pháp trong 2.x, bởi vì nó sẽ trả về một danh sách các cặp khóa-giá trị . Chúng tôi không muốn xây dựng một danh sách chỉ để lặp lại và xây dựng một từ điển mới. Đó là lý do tại sao chúng tôi thích iteritems()
, trả về một đối tượng trình lặp cung cấp một cặp giá trị quan trọng khi lặp lại.
Lưu ý: Tương đương thực tế của Python 3.x items
sẽ là phương thức Python 2.x viewitems
, trả về đối tượng xem. Đọc thêm về đối tượng xem trong tài liệu chính thức, here.
iter*
vs view*
phương pháp trong Python 2.x
Sự khác biệt chính giữa iter*
chức năng và chức năng view*
bằng Python 2.x là, các đối tượng xem phản ánh tình trạng hiện tại của từ điển. Ví dụ,
>>> d = {1: 2}
>>> iter_items = d.iteritems()
>>> view_items = d.viewitems()
bây giờ chúng ta thêm một yếu tố mới vào từ điển
>>> d[2] = 3
Nếu bạn cố gắng để kiểm tra xem (2, 3)
(cặp key-value) là trong iter_items
, nó sẽ ném ra một lỗi
>>> (2, 3) in iter_items
Traceback (most recent call last):
File "<input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
nhưng đối tượng xem sẽ phản ánh trạng thái hiện tại của từ điển. Vì vậy, nó sẽ hoạt động tốt
>>> (2, 3) in view_items
True
'map' là từ khóa, không sử dụng làm tên từ điển. –
Tôi đã thay đổi từ ngữ thành dict là kết quả là –
@KevinLee, 'dict' cũng là một từ khóa :-)) – ForceBru