2013-09-26 93 views
8

Trước khi đăng, tôi đã trải qua Access an arbitrary element in a dictionary in Python, nhưng tôi không chắc chắn về điều này.Cách truy cập phần tử đầu tiên và cuối cùng trong một từ điển python?

Tôi có một từ điển dài và tôi đã nhận được các giá trị của khóa đầu tiên và cuối cùng của nó. Tôi có thể sử dụng dict[dict.keys()[0]]dict[dict.keys()[-1]] để lấy các phần tử đầu tiên và cuối cùng, nhưng vì cặp khóa: giá trị được xuất dưới dạng ngẫu nhiên (như trong vị trí của cặp khóa: giá trị là ngẫu nhiên), giải pháp luôn được cung cấp trong liên kết này công việc?

Trả lời

16

Sử dụng OrderedDict, vì từ điển thông thường không giữ thứ tự chèn của các phần tử khi di chuyển nó.Đây là cách:

# import the right class 
from collections import OrderedDict 

# create and fill the dictionary 
d = OrderedDict() 
d['first'] = 1 
d['second'] = 2 
d['third'] = 3 

# retrieve key/value pairs 
els = list(d.items()) # explicitly convert to a list, in case it's Python 3.x 

# get first inserted element 
els[0] 
=> ('first', 1) 

# get last inserted element 
els[-1] 
=> ('third', 3) 
+2

Theo Python 3.6 OrderDict() không còn cần thiết, bởi vì việc thực hiện từ điển bản địa hiện tại duy trì thứ tự chèn. –

+0

@juanIsaza Bạn có thể cung cấp liên kết bằng chứng không? – TechJS

+0

Có cách nào để thực hiện nó mà không phải sao chép toàn bộ nội dung từ điển vào danh sách không? Một cái gì đó như d.front() và d.back()? – Mattia

1

Từ điển Python không có thứ tự, do đó, "đầu tiên" và "cuối cùng" không được xác định. Thay vào đó, bạn có thể sắp xếp các khóa của mình, sau đó truy cập phần tử được liên kết với khóa đầu tiên và cuối cùng trong tập hợp được sắp xếp của bạn.

EDIT:

Các OP làm rõ rằng bằng cách "đầu tiên" và "cuối cùng", ông có nghĩa là thứ tự mà các phím đã được bổ sung vào từ điển. collections.OrderedDict sẽ hoạt động trong trường hợp này.

+0

Đó là những gì tôi đã nói. Có giải pháp nào cho điều này? – PythonEnthusiast

+0

@ user1162512 Tôi đã thêm đề xuất để sắp xếp các khóa, nhưng đó là điều tốt nhất bạn có thể làm. –

+0

Điều gì sẽ xảy ra nếu tôi lưu trữ từ điển của mình dưới dạng 'dict = {" xyz ": 294," a ": 1," rah ": 129}'. Trên cơ sở những gì tôi sẽ sắp xếp các phím để có được quyền truy cập của xyz và rah. – PythonEnthusiast

1

Không có từ khóa "đầu tiên" hoặc "cuối cùng" trong từ điển, không đảm bảo bất kỳ thứ tự cụ thể nào. Vì vậy, có không có khả năng để nhận được phần tử "đầu tiên" hoặc "cuối cùng". Bạn chỉ có thể tạo wrapper của riêng bạn xung quanh trăn dict, mà sẽ lưu trữ các thông tin về "đầu tiên" và "cuối cùng" đối tượng

Something như

class MyDict: 

    def __init__(self): 
    self.first=None 
    self.last=None 
    self.dict={} 

    def add(key, value): 
    if self.first==None: self.first=key 
    self.last=key 
    self.dict[key]=value 

    def get(key): 
    return self.dict[key] 

    def first(): 
    return self.dict[ self.first ] 

    def last(): 
    return self.dict[ self.last ] 

Mặc dù như nó đã được chỉ ra trong các bình luận đã có là một lớp OrderedDict: http://docs.python.org/2/library/collections.html#collections.OrderedDict

điển Ordered cũng giống như từ điển thông thường, nhưng họ nhớ theo thứ tự mà mục đã được chèn vào. Khi lặp lại trên một từ khóa được đặt hàng, các mục được trả lại theo thứ tự các khóa của chúng được thêm đầu tiên.

+4

Hoặc sử dụng '' collection.OrderedDict'', nếu định nghĩa của nó là "đầu tiên" và "cuối cùng" trùng với OP. – fjarri

+0

Và làm cách nào để tạo trình bao bọc? Bất kỳ bản demo nào? – PythonEnthusiast

0

CPython chi tiết thực hiện: Phím và các giá trị được liệt kê trong một trật tự tùy ý đó là không ngẫu nhiên, thay đổi qua việc triển khai Python, và phụ thuộc vào lịch sử của từ điển của chèn và xóa bỏ. - dict documentation

Tuy nhiên tôi khuyên bạn nên để không phụ thuộc vào thứ tự của các mục trong associative array cấu trúc dữ liệu (dict là một trong số họ) vì thường xuyên không có cách nào rõ ràng duy nhất để đặt phím. Ví dụ: trong python "21" < "3" trong khi 21 > 3.

0

def dictionarySortingExample (yourDictionary):

#get all the keys and store them to a list 
allKeys = yourDictionary.keys() 

#sort the list of keys 
allKeysSorted = sorted(allKeys) 

#retrieve the first and last keys in the list 
firstKey = allKeysSorted[0] 
lastKey = allKeysSorted[-1] 

#retrive the values from the dictionary 
firstValue = yourDictionary[firstKey] 
lastValue = yourDictionary[lastKey] 

print "---Sorted Dictionary---" 
print "original dictionary: " + str(yourDictionary) 
print "list of all keys: " + str(allKeys) 
print "ordered list of all keys: " + str(allKeysSorted) 
print "first item in sorted dictionary: " + str(firstKey) + ":" + str(firstValue) 
print "last item in sorted dictionary: " + str(lastKey) + ":" + str(lastValue) 

điển ví dụ sắp xếp

sampleDictionary = {4: "bốn", "Cranberry": 2, 3: "ba" , 2: "hai", "Apple": 3, 1: "một", "Bananna": 1} từ điểnSortingExample (sampleDictionary)

0

Nếu làm việc với Python 3.6+ bạn có thể làm một lớp lót:

Đầu tiên:

list({'fist': 1, 'second': 2, 'last': 3}.items())[0] 
=> ('first', 1) 

cuối:

list({'fist': 1, 'second': 2, 'third': 3}.items())[-1] 
=> ('third', 1) 

Đây là trường hợp vì Python 3.6+ từ điển mặc định giữ gìn trật tự chèn.

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