Tôi có một Từ điển bên dưới:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
Làm cách nào để lập chỉ mục mục nhập đầu tiên trong từ điển?
colors[0]
sẽ trả về một KeyError
vì những lý do rõ ràng.
Tôi có một Từ điển bên dưới:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
Làm cách nào để lập chỉ mục mục nhập đầu tiên trong từ điển?
colors[0]
sẽ trả về một KeyError
vì những lý do rõ ràng.
Câu trả lời:
Các từ điển không có thứ tự trong các phiên bản Python cho đến và bao gồm cả Python 3.6. Nếu bạn không quan tâm đến thứ tự của các mục nhập và vẫn 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]
và 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 mục trong Python 2.x. Vì vậy, nếu bạn cần chúng nhiều hơn thì 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 với 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 chìa khóa. (Nhân tiện, tại sao các số của bạn lại là chuỗi?)
Trong Python 3.7, các từ điển thông thường được sắp xếp theo thứ tự, vì vậy bạn không cần phải sử dụng OrderedDict
nữa (nhưng bạn vẫn có thể - về cơ bản nó cùng một loại). Việc triển khai CPython của Python 3.6 đã bao gồm thay đổi đó, nhưng vì nó không phải là một phần của đặc tả ngôn ngữ, bạn không thể dựa vào nó trong Python 3.6.
d.iterkeys().next()
thay vì d.keys()[0]
kiểm tra một trong các khóa mà không cần xóa nó. Nếu từ điển lớn, nó sẽ tạo ra sự khác biệt lớn về mặt hiệu suất. Tương tự đối với các giá trị và mục. Trong Python 2.7 bạn cũng có thể sử dụng dict đối tượng xem
Nếu ai đó vẫn đang xem câu hỏi này, câu trả lời hiện được chấp nhận hiện đã lỗi thời:
Kể từ Python 3.7 *, các từ điển được bảo toàn trật tự , nên giờ đây chúng hoạt động chính xác như collections.OrderedDict
trước đây. Thật không may, vẫn không có phương pháp chuyên dụng nào để lập chỉ mục vào keys()
/ values()
của từ điển, vì vậy việc lấy khóa / giá trị đầu tiên trong từ điển có thể được thực hiện như
first_key = list(colors)[0]
first_val = list(colors.values())[0]
hoặc cách khác (điều này tránh tạo chế độ xem khóa thành danh sách):
def get_first_key(dictionary):
for key in dictionary:
return key
raise IndexError
first_key = get_first_key(colors)
first_val = colors[first_key]
Nếu bạn cần n
khóa -th, thì 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")
(* CPython 3.6 đã bao gồm các phần có thứ tự, nhưng đây chỉ là chi tiết triển khai. Đặc tả ngôn ngữ bao gồm các phần có thứ tự từ 3.7 trở đi.)
Giải quyết một yếu tố của từ điển giống như ngồi trên con lừa và tận hưởng chuyến đi.
Theo quy tắc của Python DICTIONARY là không có thứ tự
Nếu đó là
dic = {1: "a", 2: "aa", 3: "aaa"}
Bây giờ giả sử nếu tôi thích dic[10] = "b"
, thì 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 là
dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}
Hoặc là
dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}
Hoặc bất kỳ sự kết hợp nào như vậy.
Vì vậy, quy tắc ngón tay cái là DICTIONARY là vô trật tự !
Nếu bạn cần một từ điển có thứ tự, bạn có thể sử dụng odict .
thực sự tôi đã tìm thấy một giải pháp mới thực sự giúp ích cho 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 có thể chỉ cần đặt giá trị của từ điển thành Chỉ mục đó !:
Cứ xem đi:
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}
Giờ đây, thông qua sức mạnh của bản đồ băm, bạn có thể kéo chỉ mục các mục nhập của mình trong thời gian không đổi (hay còn gọi là nhanh hơn rất nhiều)
oh, đó là một khó khăn. Những gì bạn có ở đây, về cơ bản, là hai giá trị cho mỗi mục. Sau đó, bạn đang cố gắng gọi cho họ bằng một số làm chìa khóa. Rất tiếc, một trong các giá trị của bạn đã được đặt làm khóa!
Thử đi:
colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}
Bây giờ bạn có thể gọi các khóa theo số như thể chúng được lập chỉ mục giống như một danh sách. Bạn cũng có thể tham khảo màu và số theo vị trí của chúng trong danh sách.
Ví dụ,
colors[1][0]
// returns 'blue'
colors[3][1]
// returns '8'
Tất nhiên, bạn sẽ phải nghĩ ra một cách khác để theo dõi vị trí của từng màu. Có thể bạn có thể có một từ điển khác lưu trữ khóa của từng màu như giá trị của nó.
color_key = {'blue': 1, 'red': 6, 'yllow': 8}
Sau đó, bạn cũng có thể tra cứu phím màu nếu cần.
color [Colors_key ['blue']] [0] sẽ trả về 'blue'
Đại loại vậy.
Và sau đó, trong khi bạn đang ở đó, bạn có thể tạo ra một mệnh đề với các giá trị số làm khóa để bạn luôn có thể sử dụng chúng để tra cứu màu sắc của mình, bạn biết đấy, nếu bạn cần.
giá trị = {5: [1, 'blue'], 6: [2, 'red'], 8: [3, 'yellow']}
Sau đó, (màu sắc [khóa_màu sắc [giá_trị [5] [1]]] [0]) sẽ trả về 'xanh lam'.
Hoặc bạn có thể sử dụng một danh sách các danh sách.
Chúc may mắn!
Bạn không thể, vì dict
không có thứ tự. bạn có thể sử dụng .popitem()
để lấy một mục tùy ý, nhưng điều đó sẽ xóa nó khỏi dict.