2013-09-26 13 views
8

Göndermeden önce, zaten Access an arbitrary element in a dictionary in Python geçtiniz, ama bunun hakkında emin değilim. Sözlük pythonundaki ilk ve son öğelere nasıl erişilir?

Ben uzun bir sözlük var ve onun ilk ve son anahtarlarının değerlerini almak ettik. Çözelti her zaman bu bağlantıyı temin edecektir: (değer çiftlerini rastgele anahtar konumlandırılmasında gibi) hazırlanmıştır: ilk ve son elemanlar almak için dict[dict.keys()[0]] ve dict[dict.keys()[-1]] kullanımı, ama önemli yana olabilir değer çiftleri rastgele biçimde çıkarılmaktadır iş?

cevap

16

kullanımı bir OrderedDict, bu geçme zaman normal sözlük unsurları ekleme sırasını korumak için reddedildi.

# 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

Python 3.6'dan itibaren OrderDict() artık geçerli değil, çünkü geçerli yerel sözlük uygulaması ekleme sırasını koruyor. –

+0

@juanIsaza Bir kanıt bağlantısı sağlayabilir misiniz lütfen ?! – TechJS

+0

Tüm sözlük içeriğini bir listeye kopyalamak zorunda kalmadan bunu yapmanın bir yolu var mı? D.front() ve d.back() gibi bir şey? – Mattia

1

Python sözlükleri sırasız, yani "ilk" ve "son" tanımlı değil. Bunun yerine, anahtarlarınızı sıralayabilir ve sıralı kümenizdeki ilk ve son anahtarla ilişkilendirilmiş öğeye erişebilirsiniz.

DÜZENLEME:

OP "ilk" ve "son" ile o tuşları sözlüğe eklendi sırayı anlamına geldiğini açıkladı. Bu dava için collections.OrderedDict çalışmalıdır.

+0

Söylediklerim. Bunun için herhangi bir çözüm var mı? – PythonEnthusiast

+0

@ user1162512 Anahtarları sıralamak için bir öneri ekledim, ancak yapabileceğiniz en iyisi bu. –

+0

Sözlüğümü 'dict = {"xyz": 294, "a": 1, "rah": 129} 'olarak depolarsam ne olur? Xyz ve rah erişimini elde etmek için anahtarları hangi temelde sıralayacağım. – PythonEnthusiast

1

böyle bir şey "ilk" ya da herhangi bir özel sipariş garanti etmez sözlükte "son" tuşuna olarak yoktur. Yani "ilk" veya "son" elemanı almak için olasılık yoktur. Sadece o yorumunda olduğuna işaret edildi

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 ] 

bulunmakla birlikte nesne

"ilk" ve "son"

şey gibi hakkında bilgi depolar piton dict etrafında kendi sarıcı oluşturabilir bir sınıf OrderedDict: http://docs.python.org/2/library/collections.html#collections.OrderedDict

Sıralı sözlükleri sadece normal sözlükler gibi ama onlar öğe eklenmedi ki sipariş hatırlıyorum. Sıralı bir sözlüğünü yinelediğinizde, öğeler, anahtarlarının ilk olarak eklendikleri sırada döndürülür.

+4

Veya "ilk" ve "son" tanımları OP'lerle çakışırsa, 'collections.OrderedDict' işlevini kullanın. – fjarri

+0

Ve nasıl bir sarıcı oluşturacağım? Herhangi bir demo? – PythonEnthusiast

0

CPython uygulama detay: Tuşlar ve değerler olmayan rastgele Python uygulamaları arasında değişiklik ve eklemeler ve silmeler ve Sözlüğün tarihine bağlı keyfi bir sırada listelenir. -

dict documentation Ancak ben çok tuşları sipariş tek bariz bir yolu yoktur sık ​​beri (dict bunlardan biridir) associative array veri yapısı öğeleri sırasına güvenmeyin öneririz. Örneğin python "21" < "3" iken 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) 

sampleDictionary = {4 tasnif örnek sözlüğü: "dört", "Kızılcık": 2, 3: "Üç" İşte nasıl , 2: "iki", "Apple": 3, 1: "bir", "Bananna": bir tek astar yapabilir 3.6+ 1} dictionarySortingExample (sampleDictionary) Python ile çalışan

0

ise:

İlk:

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

Son: Python 3.6+ varsayılan sözlüğü kampanya siparişini korur çünkü

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

Bu böyledir.

İlgili konular