2011-08-01 15 views
26

Chúng ta có thể biết vị trí của các mục trong từ điển được đặt hàng của Python không? Ví dụ:Cách biết vị trí của các mục trong từ điển đặt hàng của Python

Nếu tôi có từ điển:

// Ordered_dict is OrderedDictionary 

Ordered_dict = {"fruit": "banana", "drinks": "water", "animal": "cat"} 

Bây giờ làm thế nào để biết trong đó vị trí con mèo thuộc về? Có thể nhận câu trả lời như:

position (Ordered_dict["animal"]) = 2 ? hoặc theo cách khác?

+7

Từ điển của bạn không phải là một mệnh lệnh được đặt hàng - đó là một dict Python không có thứ tự. –

+8

Chỉ vì bạn gọi nó là lệnh dict không làm cho nó một! – Jacob

Trả lời

49

Bạn có thể nhận được danh sách các phím với keys tài sản:

In [20]: d=OrderedDict((("fruit", "banana"), ("drinks", 'water'), ("animal", "cat"))) 

In [21]: d.keys().index('animal') 
Out[21]: 2 

Một hiệu suất tốt hơn có thể đạt được với việc sử dụng iterkeys() mặc dù.

Đối với những người sử dụng Python 3

>>> list(x.keys()).index("c") 
1 
+23

'list (d.keys()). Index ('animal')' cho bất kỳ ai sử dụng ** Python3 ** kết thúc ở đây. – Torxed

+6

Có vẻ như chỉ đơn giản bằng cách sử dụng 'list (d) .index ('animal')' cũng hoạt động trong Python 3, trừ khi tôi thiếu một cái gì đó. – Marein

+0

Đối với python 3 xem: https://stackoverflow.com/q/44147047/281545 –

3

suy nghĩ đầu tiên mà bạn cần là để đọc tài liệu hướng dẫn. Nếu bạn mở python hướng dẫn và sau đó cố gắng tìm kiếm thông tin về OrderedDict bạn sẽ thấy như sau:

lớp collections.OrderedDict ([mục]) - Quay trở lại một thể hiện của một lớp con dict , hỗ trợ các phương pháp dict bình thường. OrderedDict là một dict ghi nhớ thứ tự các khóa được chèn lần đầu tiên. Nếu mục nhập mới ghi đè mục nhập hiện có, vị trí chèn ban đầu sẽ bị giữ nguyên . Xóa một mục nhập và lắp lại nó sẽ di chuyển nó đến cuối .

Tính năng mới trong phiên bản 2.7.

Vì vậy, trong trường hợp bạn đang sử dụng từ điển đặt hàng và bạn sẽ không xóa khóa - thì 'động vật' sẽ luôn ở vị trí bạn thêm - ví dụ: Chỉ số 2.

Ngoài ra để có được một chỉ số của một 'con mèo' bạn chỉ có thể sử dụng:

from collections import OrderedDict 
d = OrderedDict((("fruit", "banana"), ("drinks", "water"), ("animal", "cat"))) 
d.keys() 
>>> ['fruit', 'drinks', 'animal'] 
d.values() 
>>> ['banana', 'water', 'cat'] 
# So 
d.values().index('cat') 
>>> 2 
2

Đối Python3: tuple(d).index('animal')

này là gần như giống như câu trả lời Marein của trên, nhưng sử dụng một không thay đổi tuple thay vì danh sách có thể thay đổi. Vì vậy, nó sẽ chạy nhanh hơn một chút (~ 12% nhanh hơn trong kiểm tra độ nhanh chóng của tôi).

+0

Lưu ý rằng điều này cũng hoạt động trong Python 2 (tuple (d) chỉ lặp qua các phím của từ điển và tạo ra một bộ tuple) –

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