Rất ít người xuất hiện, mặc dù có nhiều câu trả lời cho câu hỏi này, đã chỉ ra rằng từ điển là các ánh xạ không có thứ tự, và do đó (cho đến khi có được thứ tự chèn với Python 3.7), ý tưởng về mục từ "đầu tiên" trong từ điển được thực hiện theo nghĩa đen vô nghĩa. Và thậm chí một OrderedDict
chỉ có thể được truy cập bằng chỉ mục số bằng cách sử dụng các độ xấu như mydict[mydict.keys()[0]]
(chỉ trong Python 2, vì trong Python 3 keys()
là một trình lặp không thể thay thế.)
Từ 3.7 trở đi và trong thực tế cũng vậy trong 3.6 - hành vi mới đã được giới thiệu sau đó, nhưng không được bao gồm như một phần của đặc tả ngôn ngữ cho đến 3.7 - lặp lại các khóa, giá trị hoặc mục của một mệnh lệnh (và, tôi tin rằng, đặt cũng) sẽ mang lại các đối tượng được chèn gần đây nhất trước tiên. Vẫn không có cách nào đơn giản để truy cập chúng bằng chỉ số chèn.
Đối với câu hỏi về việc chọn và "định dạng" các mục, nếu bạn biết khóa bạn muốn truy xuất trong từ điển, bạn thường sử dụng khóa đó như một chỉ số phụ để lấy nó (my_var = mydict['Apple']
).
Nếu bạn thực sự muốn có thể lập chỉ mục các mục theo số mục nhập (bỏ qua thực tế là số của mục nhập cụ thể sẽ thay đổi khi thực hiện chèn) thì cấu trúc thích hợp có thể là danh sách các bộ gồm hai phần tử. Thay vì
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
bạn có thể sử dụng:
mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]
Theo chế độ này, mục nhập đầu tiên mylist[0]
ở dạng danh sách kết thúc cổ điển và giá trị của nó là ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Bạn có thể lặp lại toàn bộ danh sách như sau:
for (key, value) in mylist: # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])
nhưng nếu bạn biết bạn đang tìm chìa khóa "Apple", tại sao bạn không sử dụng một câu lệnh thay thế?
Bạn có thể giới thiệu một cấp độ điều hướng bổ sung bằng cách lưu vào bộ đệm danh sách các khóa, nhưng sự phức tạp của việc giữ hai cấu trúc dữ liệu đồng bộ hóa chắc chắn sẽ làm tăng thêm độ phức tạp cho mã của bạn.