Как получить доступ к первому и последнему элементам в словаре python?

перед публикацией я уже прошел через доступ к произвольному элементу в словаре в Python, но я не уверен в этом.

у меня есть длинный словарь и я, чтобы получить значения его первого и последнего ключей. Я могу использовать dict[dict.keys()[0]] и dict[dict.keys()[-1]] чтобы получить первый и последний элементы, но так как пары ключ:значение выводятся в случайном виде(как и в позиционировании пары ключ: значение является случайным), будет ли решение, приведенное в этой ссылке всегда работа?

7 ответов


использовать OrderedDict, потому что обычный словарь не сохраняет порядок вставки своих элементов при его обходе. Вот как:

# 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)

в словаре нет такого понятия, как" первый "или" Последний " ключ, который не гарантирует какого-либо конкретного порядка. Так что есть нет возможности чтобы получить "первый" или "последний" элемент. Вы можете создать только свою собственную оболочку вокруг python dict, которая будет хранить информацию о "первом" и "последнем" объекте

что-то вроде

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 ]

хотя, как было указано в комментарии, уже есть класс OrderedDict: http://docs.python.org/2/library/collections.html#collections.OrderedDict

упорядоченные словари похожи на обычные словари, но они помнят порядок вставки элементов. При итерации по порядку словарь, элементы возвращаются в том порядке, в котором их ключи были первыми добавлен.


словари Python неупорядочены, поэтому "первый" и "последний" не определены. Вместо этого можно отсортировать ключи, а затем получить доступ к элементу, связанному с первым и последним ключом в отсортированном наборе.

изменить:

ОП уточнил, что под "первым" и "последним" он подразумевал порядок добавления ключей в словарь. collections.OrderedDict должно работать для этого случая.


детали реализации CPython: ключи и значения перечислены в произвольном порядке, который является неслучайным, варьируется в разных реализациях Python и зависит от истории вставок и удалений словаря. -- dict документация

однако я настоятельно рекомендую не полагаться на порядок элементов в ассоциативный массив структура данных (dict является одним из них), так как часто нет единого очевидного способа заказать ключи. Для пример в Python "21" < "3" while 21 > 3.


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)

пример сортировки словарей

sampleDictionary = {4:"четыре", "Клюква":2, 3:"три", 2: "два", "Яблоко": 3, 1: "один", "Бананна": 1} dictionarySortingExample (sampleDictionary)


при работе с Python 3.6+ вы можете сделать один лайнер:

первый:

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

вчера:

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

это так, потому что словарь Python 3.6+ по умолчанию сохраняет порядок вставки.


вы можете сделать это с помощью list ().

dir = dict()

dir['Key-3'] = 'Value-3'    # Added First Item
dir['Key-2'] = 'Value-2'    # Added Second Item
dir['Key-4'] = 'Value-4'    # Added Third Item
dir['Key-1'] = 'Value-1'    # Added Fourth Item

lst = list(dir.items())     # For key & value
# lst = list(dir.keys())    # For keys
# lst = list(dir.values())  # For values

print('First Element:- ', lst[0])
print('Last Element:- ', lst[-1])

выход:-

Первый Элемент:-('Key-3','Value-3')

Последний Элемент:-('Key-1','Value-1')