Hướng dẫn is order preserved in dictionary python? - thứ tự được giữ nguyên trong từ điển python?

Tôi có một từ điển mà tôi đã khai báo theo một thứ tự cụ thể và muốn giữ nó theo thứ tự đó mọi lúc. Các khóa/giá trị thực sự không thể được giữ theo thứ tự dựa trên giá trị của chúng, tôi chỉ muốn nó theo thứ tự mà tôi đã tuyên bố.

Vì vậy, nếu tôi có từ điển:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

Nó không theo thứ tự đó nếu tôi xem nó hoặc lặp lại thông qua nó, có cách nào để đảm bảo Python sẽ giữ thứ tự rõ ràng mà tôi đã tuyên bố các khóa/giá trị trong không?

Hướng dẫn is order preserved in dictionary python? - thứ tự được giữ nguyên trong từ điển python?

Flimzy

70.7K15 Huy hiệu vàng132 Huy hiệu bạc171 Huy hiệu đồng15 gold badges132 silver badges171 bronze badges

Hỏi ngày 8 tháng 12 năm 2009 lúc 15:53Dec 8, 2009 at 15:53

Roflwaffleroflwaffleroflwaffle

28.6K21 Huy hiệu vàng70 Huy hiệu bạc94 Huy hiệu đồng21 gold badges70 silver badges94 bronze badges

1

Từ Python 3.6 trở đi, loại

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
4 tiêu chuẩn duy trì thứ tự chèn theo mặc định.

Xác định

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

sẽ dẫn đến một từ điển với các khóa trong thứ tự được liệt kê trong mã nguồn.

Điều này đã đạt được bằng cách sử dụng một mảng đơn giản với các số nguyên cho bảng băm thưa thớt, trong đó các số nguyên đó chỉ mục vào một mảng khác lưu trữ các cặp giá trị khóa (cộng với băm được tính toán). Mảng sau đó chỉ xảy ra để lưu trữ các mục theo thứ tự chèn và toàn bộ sự kết hợp thực sự sử dụng ít bộ nhớ hơn so với việc triển khai được sử dụng trong Python 3.5 trở lên. Xem bài viết ý tưởng ban đầu của Raymond Hettinger để biết chi tiết.

Trong 3.6, điều này vẫn được coi là một chi tiết thực hiện; Xem tài liệu mới trong tài liệu Python 3.6:

Khía cạnh bảo tồn đơn đặt hàng của triển khai mới này được coi là một chi tiết thực hiện và không nên dựa vào (điều này có thể thay đổi trong tương lai Để bắt buộc các ngữ nghĩa bảo tồn đơn đặt hàng cho tất cả các triển khai Python hiện tại và tương lai, điều này cũng giúp duy trì khả năng tương thích ngược với các phiên bản cũ hơn của ngôn ngữ nơi thứ tự lặp lại ngẫu nhiên vẫn có hiệu lực, ví dụ: Python 3.5).

Python 3.7 nâng chi tiết triển khai này lên đặc điểm kỹ thuật ngôn ngữ, do đó, bắt buộc

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
4 bảo tồn đơn đặt hàng trong tất cả các triển khai Python tương thích với phiên bản đó hoặc mới hơn. Xem tuyên bố của BDFL. Kể từ Python 3.8, từ điển cũng hỗ trợ lặp lại ngược lại.

Bạn vẫn có thể muốn sử dụng lớp

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
6 trong một số trường hợp nhất định, vì nó cung cấp một số chức năng bổ sung trên đầu loại
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
4 tiêu chuẩn. Chẳng hạn như có thể đảo ngược (điều này mở rộng cho các đối tượng xem) và hỗ trợ sắp xếp lại (thông qua phương thức
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
8).

Đã trả lời ngày 16 tháng 9 năm 2016 lúc 17:40Sep 16, 2016 at 17:40

Martijn Pieters ♦ Martijn PietersMartijn Pieters

993K277 Huy hiệu vàng3914 Huy hiệu bạc3258 Huy hiệu đồng277 gold badges3914 silver badges3258 bronze badges

4

from collections import OrderedDict
OrderedDict((word, True) for word in words)

chứa

OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])

Nếu các giá trị là

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
9 (hoặc bất kỳ đối tượng bất biến nào khác), bạn cũng có thể sử dụng:

OrderedDict.fromkeys(words, True)

Đã trả lời ngày 11 tháng 6 năm 2012 lúc 14:26Jun 11, 2012 at 14:26

7

Thay vì giải thích phần lý thuyết, tôi sẽ đưa ra một ví dụ đơn giản.

>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}

Đã trả lời ngày 30 tháng 1 năm 2015 lúc 7:29Jan 30, 2015 at 7:29

Mohit dabasmohit dabasMohit Dabas

2.3031 Huy hiệu vàng17 Huy hiệu bạc12 Huy hiệu đồng1 gold badge17 silver badges12 bronze badges

6

Lưu ý rằng câu trả lời này áp dụng cho các phiên bản Python trước Python3.7. CPython 3.6 duy trì thứ tự chèn trong hầu hết các trường hợp như một chi tiết thực hiện. Bắt đầu từ Python3.7 trở đi, người ta đã tuyên bố rằng việc triển khai phải duy trì lệnh chèn để tuân thủ.


Từ điển Python không được đặt hàng. Nếu bạn muốn một từ điển được đặt hàng, hãy thử thu goms.ordereddict.

Lưu ý rằng OrderedDict đã được đưa vào thư viện tiêu chuẩn trong Python 2.7. Nếu bạn có phiên bản Python cũ hơn, bạn có thể tìm thấy các công thức nấu ăn cho các từ điển được đặt hàng trên ActiveState.

Đã trả lời ngày 11 tháng 6 năm 2012 lúc 14:25Jun 11, 2012 at 14:25

Hướng dẫn is order preserved in dictionary python? - thứ tự được giữ nguyên trong từ điển python?

Mgilsonmgilsonmgilson

290K61 Huy hiệu vàng608 Huy hiệu bạc676 Huy hiệu Đồng61 gold badges608 silver badges676 bronze badges

1

Từ điển sẽ sử dụng một đơn đặt hàng giúp tìm kiếm hiệu quả và bạn không thể thay đổi điều đó,

Bạn chỉ có thể sử dụng một danh sách các đối tượng (một phần tử 2 trong một trường hợp đơn giản hoặc thậm chí là một lớp) và nối các mục vào cuối. Sau đó, bạn có thể sử dụng tìm kiếm tuyến tính để tìm các mục trong đó.

Ngoài ra, bạn có thể tạo hoặc sử dụng một cấu trúc dữ liệu khác được tạo với mục đích duy trì trật tự.

Đã trả lời ngày 8 tháng 12 năm 2009 lúc 15:57Dec 8, 2009 at 15:57

Lửa Lancerfire LancerFire Lancer

28.8K29 Huy hiệu vàng114 Huy hiệu bạc179 Huy hiệu đồng29 gold badges114 silver badges179 bronze badges

1

Tôi đã bắt gặp bài đăng này trong khi cố gắng tìm ra cách để đặt hàng để làm việc. PYDEV cho Eclipse không thể tìm thấy lệnh, vì vậy cuối cùng tôi đã quyết định thực hiện một bộ phận chính của các giá trị chính của từ điển của tôi vì tôi muốn chúng được đặt hàng. Khi tôi cần xuất danh sách của mình, tôi chỉ lặp qua các giá trị của Tuple và cắm 'phím' được lặp lại từ tuple vào từ điển để lấy các giá trị của tôi theo thứ tự tôi cần chúng.

example:

test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])

Đó là một chút cồng kềnh, nhưng tôi bị ép thời gian và đó là cách giải quyết tôi nghĩ ra.

Lưu ý: Danh sách các danh sách cách tiếp cận mà người khác đề xuất không thực sự có ý nghĩa với tôi, bởi vì các danh sách được đặt hàng và lập chỉ mục (và cũng là một cấu trúc khác với từ điển).

Đã trả lời ngày 16 tháng 6 năm 2014 lúc 21:17Jun 16, 2014 at 21:17

smushfacesmushfacesmushface

891 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges

1

Bạn thực sự không thể làm những gì bạn muốn với một từ điển. Bạn đã có từ điển

from collections import OrderedDict
OrderedDict((word, True) for word in words)
0 được xử lý. Tôi thấy không có cách nào để giữ theo thứ tự một khi nó đã được tạo ra. Những gì tôi đã làm là tạo một tệp JSON thay vì với đối tượng:

{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}

Tôi đã sử dụng:

r = json.load(open('file.json'), object_pairs_hook=OrderedDict)

sau đó được sử dụng:

print json.dumps(r)

để xác minh.

Đã trả lời ngày 2 tháng 9 năm 2016 lúc 1:05Sep 2, 2016 at 1:05

nealous3nealous3nealous3

6741 Huy hiệu vàng10 Huy hiệu bạc20 Huy hiệu đồng1 gold badge10 silver badges20 bronze badges

2

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
0

SANYASSH

7.66213 Huy hiệu vàng31 Huy hiệu bạc62 Huy hiệu Đồng13 gold badges31 silver badges62 bronze badges

Đã trả lời ngày 15 tháng 5 năm 2019 lúc 7:36May 15, 2019 at 7:36

1

Một cách khác là sử dụng gấu trúc

from collections import OrderedDict
OrderedDict((word, True) for word in words)
1 vì nó đảm bảo thứ tự và vị trí chỉ số của các mục trong một cấu trúc giống như di sản.

Đã trả lời ngày 18 tháng 3 năm 2019 lúc 1:43Mar 18, 2019 at 1:43

VillevilleVille

3.9582 Huy hiệu vàng36 Huy hiệu bạc37 Huy hiệu đồng2 gold badges36 silver badges37 bronze badges

Tôi đã có một vấn đề tương tự khi phát triển một dự án Django. Tôi không thể sử dụng OrderEddict, vì tôi đang chạy một phiên bản cũ của Python, vì vậy giải pháp là sử dụng lớp Sắp xếp của Django:

https://code.djangoproject.com/wiki/SortedDict

e.g.,

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
1

Lưu ý: Câu trả lời này có nguồn gốc từ năm 2011. Nếu bạn có quyền truy cập vào phiên bản Python 2.7 trở lên, thì bạn nên có quyền truy cập vào tiêu chuẩn

from collections import OrderedDict
OrderedDict((word, True) for word in words)
2 hiện tại, trong đó nhiều ví dụ đã được cung cấp bởi những người khác trong chủ đề này.

Đã trả lời ngày 2 tháng 6 năm 2011 lúc 15:46Jun 2, 2011 at 15:46

Hướng dẫn is order preserved in dictionary python? - thứ tự được giữ nguyên trong từ điển python?

Evan Byrneevan ByrneEvan Byrne

1.0631 Huy hiệu vàng13 Huy hiệu bạc16 Huy hiệu đồng1 gold badge13 silver badges16 bronze badges

0

Nói chung, bạn có thể thiết kế một lớp hoạt động giống như một từ điển, chủ yếu là thực hiện các phương thức

from collections import OrderedDict
OrderedDict((word, True) for word in words)
3,
from collections import OrderedDict
OrderedDict((word, True) for word in words)
4,
from collections import OrderedDict
OrderedDict((word, True) for word in words)
5,
from collections import OrderedDict
OrderedDict((word, True) for word in words)
6 và một số khác. Lớp đó có thể có bất kỳ hành vi nào bạn thích, ví dụ như bảo vệ một trình lặp được sắp xếp trên các khóa ...

Đã trả lời ngày 8 tháng 12 năm 2009 lúc 16:09Dec 8, 2009 at 16:09

Rasmus Kajrasmus KajRasmus Kaj

3.9651 Huy hiệu vàng19 Huy hiệu bạc22 Huy hiệu đồng1 gold badge19 silver badges22 bronze badges

Nếu bạn muốn có một từ điển theo một thứ tự cụ thể, bạn cũng có thể tạo một danh sách danh sách, trong đó mục đầu tiên sẽ là chìa khóa và mục thứ hai sẽ là giá trị và sẽ trông giống như ví dụ này

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
2

Eyquem

26.1k7 Huy hiệu vàng36 Huy hiệu bạc45 Huy hiệu Đồng7 gold badges36 silver badges45 bronze badges

Đã trả lời ngày 4 tháng 7 năm 2013 lúc 20:47Jul 4, 2013 at 20:47

Pelospelospelos

1.6022 Huy hiệu vàng23 Huy hiệu bạc29 Huy hiệu đồng2 gold badges23 silver badges29 bronze badges

2

Bạn có thể làm điều tương tự mà tôi đã làm cho từ điển.

Tạo một danh sách và từ điển trống:

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
3

Đã trả lời ngày 29 tháng 1 năm 2019 lúc 9:27Jan 29, 2019 at 9:27

Có phải đặt thứ tự bảo quản trong từ điển?

và thứ tự từ điển được đảm bảo là thứ tự chèn.). @Manuelselva Phần phân cấp loại tiêu chuẩn của các tài liệu mô hình dữ liệu cũng bao gồm các chủ đề (từ điển bảo tồn thứ tự chèn, có nghĩa là các khóa sẽ được sản xuất theo cùng thứ tự chúng được thêm tuần tự qua từ điển.).Dictionaries preserve insertion order, meaning that keys will be produced in the same order they were added sequentially over the dictionary.).

Từ điển có lưu trữ dữ liệu theo thứ tự được sắp xếp không?

Từ điển là một cấu trúc dữ liệu quan trọng lưu trữ dữ liệu bằng cách ánh xạ các khóa với các giá trị. Các từ điển mặc định trong Python là các cấu trúc dữ liệu không được đặt hàng. Giống như danh sách, chúng ta có thể sử dụng hàm Sắp xếp () để sắp xếp từ điển theo các khóa. Tuy nhiên, nó sẽ chỉ trả về một danh sách các khóa được sắp xếp, thường không phải là những gì chúng ta mong muốn.we can use the sorted() function to sort the dictionary by keys. However, it will only return a list of sorted keys, which is usually not what we desire.

Đặt hàng có quan trọng trong từ điển không?

Không quan trọng chúng tôi viết các cặp.Các giá trị trong từ điển được truy cập bằng các khóa, không phải bằng các chỉ số, do đó không cần phải quan tâm đến việc đặt hàng.. The values in a dictionary are accessed with keys, not with indices, so there is no need to care about ordering.

Các giá trị dict có được sắp xếp không?

Một từ điển giống như một tập hợp các cặp giá trị khóa và các bộ không được đặt hàng.Từ điển cũng không có nhiều chức năng sắp xếp lại.Chúng không giống như danh sách, nơi bạn có thể chèn các phần tử ở bất kỳ vị trí nào.sets are unordered. Dictionaries also don't have much reordering functionality. They're not like lists, where you can insert elements at any position.