2012-11-10 49 views
5

Tôi nghĩ rằng tôi muốn tạo từ điển 2d với nhiều khóa cho mỗi giá trị.Từ điển 2d có nhiều khóa cho mỗi giá trị

tôi biết làm thế nào để tạo ra một từ điển 2d sử dụng defaultdict:

from collections import defaultdict 
2d_dict = defaultdict(dict) 

2d_dict['canned_food']['spam'] = 'delicious' 

Và tôi biết rằng việc sử dụng các từ điển thông thường bạn có thể làm nhiều phím như

dictionary={('food','canned_food'):spam} 

Nhưng tôi muốn làm một cái gì đó như:

2d_dict[('canned_food','food')]['spam'] = 'delicious' 

Trong thứ nguyên đầu tiên của từ điển tôi cần ~ 25 các khóa cho mỗi giá trị. Có cách nào để thực hiện việc này với defaultdict không?

Thậm chí nếu có cách để làm điều đó với dicts thì đây có phải là cách hợp lý để tạo một bảng tra cứu đa chiều đơn giản không?

Trả lời

11

Ngoài 2d_dict là một tên biến hợp lệ (nó bắt đầu bằng một chữ số), giải pháp hiện tại của bạn đã hoạt động:

>>> from collections import defaultdict 
>>> d2_dict = defaultdict(dict) 
>>> d2_dict[('canned_food', 'food')]['spam'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}}) 

Trong thực tế, bạn thậm chí không cần dấu ngoặc đơn - Python vẫn sẽ nhận ra bạn chính là bộ đồ:

>>> d2_dict['fresh_food', 'food']['eggs'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}, 
('fresh_food', 'food'): {'eggs': 'delicious'}}) 

... và, vâng, đó là cách hoàn toàn hợp lý để xây dựng bảng tra cứu 2D + 1D.

Nếu bạn muốn xây dựng một bảng tra cứu 3D sử dụng dicts lồng nhau thay vì phím tuple, công trình này:

>>> d3_dict = defaultdict(lambda: defaultdict(dict)) 
>>> d3_dict['dried_food']['food']['jerky'] = 'chewy' 
>>> d3_dict 
defaultdict(<function <lambda> at 0x7f20af38a2a8>, 
{'dried_food': defaultdict(<type 'dict'>, {'food': {'jerky': 'chewy'}})}) 
+0

Cảm ơn bạn, tôi đã rõ ràng là cố gắng dụ (với các tên biến không hợp lệ) Tôi phải có có lỗi đánh máy. Bạn là đúng mặc dù nó chỉ hoạt động. – Keith

+0

Làm cách nào để truy cập từ điển. Tôi nghĩ: 'in d2_dict ['fresh_food'] ['eggs']' sẽ in ngon nhưng nó xuất hiện một lỗi. Nếu tôi sử dụng một từ điển mà không có một danh sách nó hoạt động tốt. Tôi có phải làm gì đặc biệt để truy cập vào dict không? – Keith

+0

''fresh_food'' không phải là khóa trong từ điển cấp cao nhất -' (' fresh_food ',' food ') 'là. Vì vậy, bạn sẽ sử dụng 'print d2_dict ['fresh_food', 'food'] ['eggs']'. –

Các vấn đề liên quan