2010-12-01 41 views
48

Tôi có một từ điển dưới đây:Làm cách nào để lập chỉ mục vào từ điển?

colors = { 
    "blue" : "5", 
    "red" : "6", 
    "yellow" : "8", 
} 

Làm thế nào để index entry đầu tiên trong từ điển?

colors[0] sẽ trả lại KeyError vì lý do hiển nhiên.

+3

không "đầu tiên" nghĩa là gì? Từ điển không có thứ tự. –

Trả lời

62

Từ điển không có thứ tự trong Python. Nếu bạn không quan tâm đến thứ tự của các mục nhập và muốn truy cập các khóa hoặc giá trị theo chỉ mục, bạn có thể sử dụng d.keys()[i]d.values()[i] hoặc d.items()[i]. (Lưu ý rằng các phương pháp này tạo danh sách tất cả các khóa, giá trị hoặc các mục tương ứng. Vì vậy, nếu bạn cần chúng nhiều hơn một lần, hãy lưu trữ danh sách trong một biến để cải thiện hiệu suất.)

Nếu bạn quan tâm đến thứ tự của các mục nhập, bắt đầu bằng Python 2.7, bạn có thể sử dụng collections.OrderedDict. Hoặc sử dụng danh sách các cặp

l = [("blue", "5"), ("red", "6"), ("yellow", "8")] 

nếu bạn không cần truy cập bằng khóa. (Tại sao các số của bạn lại bị xâu chuỗi?)

+2

Trong Python 2, sử dụng 'd.iterkeys(). Next()' thay vì 'd.keys() [0]' để kiểm tra một trong các khóa mà không xóa nó. Nếu từ điển là rất lớn, nó sẽ tạo ra một sự khác biệt lớn về hiệu suất. Cũng vậy với các giá trị và vật phẩm. Trong Python 2.7 bạn cũng có thể sử dụng [đối tượng xem dict] (http://docs.python.org/2/library/stdtypes.html#dictionary-view-objects) – simleo

+10

Trong Python 3, các cuộc gọi này trả về một khung nhìn, thay vì một danh sách thực tế, do đó bạn nên bọc chúng trong một cuộc gọi đến list() nếu không bạn sẽ thấy: "TypeError: 'dict_values' đối tượng không hỗ trợ lập chỉ mục". Xem S.O. câu hỏi: http://stackoverflow.com/questions/17431638/get-typeerror-dict-values-object-does-not-support-indexing-when-using-python – stifin

+1

Chỉ cần một chút sửa đổi: bạn không thể lập chỉ mục các mục(), ít nhất không có trong Python 3. –

1

Bạn không thể, vì dict không có thứ tự. bạn có thể sử dụng .popitem() để có được một mục tùy ý, nhưng điều đó sẽ xóa nó khỏi dict.

+0

'next (iter (d.items()))' ('.iteritems()' trong Python 2) cung cấp cho bạn một mục tùy ý (giống như trong các bài kiểm tra của tôi, điều này có ý nghĩa vì popitem có thể được thực hiện bằng cách sử dụng này) nhưng sẽ không xóa mục. – delnan

3

Nếu bạn cần từ điển đặt hàng, bạn có thể sử dụng odict.

+0

odict nhìn thấy không hỗ trợ lập chỉ mục vào các khóa(), values ​​(), hoặc items(). – Konstantin

0

Từ điển không phải là danh sách.

với danh sách bạn chỉ có thể thực hiện enter foo[0] here để nhận giá trị đó.

dicts có các hàm .value và .keys().

Nó cũng dễ sử dụng hơn để thử/trừ khi bạn lặp lại thông qua lệnh chính tả.

3

thực sự tôi tìm thấy một giải pháp mới thực sự giúp tôi, Nếu bạn đặc biệt quan tâm đến chỉ mục của một giá trị nhất định trong danh sách hoặc tập dữ liệu, bạn chỉ có thể đặt giá trị của từ điển đó thành Chỉ mục !:

Chỉ cần xem:

list = ['a', 'b', 'c'] 
dictionary = {} 
counter = 0 
for i in list: 
    dictionary[i] = counter 
    counter += 1 

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2} 

Bây giờ thông qua sức mạnh của hashmaps bạn có thể kéo chỉ số mục bạn trong thời gian liên tục (hay còn gọi là một tổng thể nhanh hơn rất nhiều)

3

Phát biểu một yếu tố của từ điển là giống như ngồi trên con lừa và tận hưởng chuyến đi.

Theo quy luật của Python DICTIONARY là orderless

Nếu có

dic = {1: "a", 2: "aa", 3: "aaa"} 

Bây giờ giả sử nếu tôi đi như dic[10] = "b", sau đó nó sẽ không thêm như thế này luôn

dic = {1:"a",2:"aa",3:"aaa",10:"b"} 

Nó có thể giống như

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"} 

Hoặc

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"} 

Hoặc

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"} 

Hoặc bất kỳ sự kết hợp như vậy.

Quy tắc ngón tay cái là DICTIONARYkhông cần đơn!

21

Nếu ai vẫn nhìn vào câu hỏi này, câu trả lời chấp nhận hiện nay bây giờ đã lỗi thời:

Kể từ Python 3.6 từ điển là để bảo quản, có nghĩa là bây giờ họ cư xử chính xác như collections.OrderedDict s sử dụng để. Thật không may, vẫn là không có phương pháp chuyên dụng để chỉ mục vào keys()/values() của từ điển, vì vậy việc khóa/giá trị đầu tiên trong từ điển có thể được thực hiện như

first_key = list(colors.keys())[0] 
first_val = list(colors.values())[0] 

hoặc cách khác (điều này tránh instantiating các phím xem vào một list):

def get_first_key(dictionary): 
    for key in dictionary.keys(): 
     return key 

first_key = get_first_key(colors) 
first_val = colors[first_key] 

Nếu bạn cần một mã khóa -thứ n, sau đó tương tự

def get_nth_key(dictionary, n=0): 
    if n < 0: 
     n += len(dictionary) 
    for i, key in enumerate(dictionary.keys()): 
     if i == n: 
      return key 
    raise IndexError("dictionary index out of range") 
Các vấn đề liên quan