Soru Sözlüke nasıl endekslenir?


Aşağıda bir sözlük var:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

Sözlükteki ilk girişi nasıl dizinlerim?

colors[0] bir geri dönecek KeyError bariz sebeplerden dolayı.


54
2017-12-01 16:40


Menşei


"İlk" ne anlama geliyor? Sözlüklerin siparişi yoktur. - S.Lott
Python 3,7'den beri sözlükler ekleniyor. Şuna bakın: stackoverflow.com/questions/39980323/... - Nikita Alkhovik


Cevaplar:


Python 3.6 ve dahil olmak üzere Python sürümlerinde sözlükler sırasızdır. Girişlerin sırasını umursamıyorsanız ve yine de indeksle anahtarlara veya değerlere erişmek istiyorsanız, d.keys()[i] ve d.values()[i] veya d.items()[i]. (Bu yöntemlerin, Python 2.x'teki tüm anahtarların, değerlerin veya öğelerin bir listesini oluşturduğunu unutmayın. Bu nedenle, bir kez daha fazlasına ihtiyacınız varsa, performansı artırmak için listeyi bir değişkende saklayın.)

Girişlerin sırasını önemsiyorsanız, Python 2.7 ile başlayarak kullanabilirsiniz. collections.OrderedDict. Ya da çiftlerin listesini kullanın

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

Anahtar ile erişime ihtiyacınız yoksa. (Senin numaraların neden bu kadar yol alıyor?)

Python 3.7'de normal sözlükler sipariş edilir, bu yüzden kullanmanıza gerek yoktur. OrderedDict artık (ama yine de yapabilirsiniz - temelde aynı tip). Python 3.6'nın CPython uygulaması zaten bu değişikliği içeriyordu, fakat dil özelliklerinin bir parçası olmadığından, Python 3.6'ya güvenemezsiniz.


70
2017-12-01 16:46



Python 2'de kullan d.iterkeys().next() yerine d.keys()[0] anahtarlardan birini çıkarmadan denetlemek için. Sözlük çok büyükse, performans açısından büyük bir fark yaratacaktır. Aynı değer ve öğeler için de geçerlidir. Python 2.7'de ayrıca kullanabilirsiniz dict nesneleri görüntüle - simleo
Python 3'te, bu çağrılar gerçek bir listeden ziyade bir görünüm döndürür, böylece onları listeye çağırmak için bir çağrıya sarmanız gerekir () aksi halde görürsünüz: "TypeError: 'dict_values' nesnesi dizinlemeyi desteklemez". Baksana S.O. soru: stackoverflow.com/questions/17431638/... - stifin
Sadece bir düzeltme nitresi: En azından Python 3'te olmayan öğeleri () endeksleyemezsiniz. - John Strong
Sağlanan geçici stifin ile yapabilirsiniz. - Doezer
Bu cevap 3.6+ python için güncel değil, lütfen @Pasha'ya göre cevaba bakınız. - hans


Hala bu soruya bakan herhangi biri varsa, şu anda kabul edilen cevap şu an modası geçmiş:

Python 3.6'dan beri sözlükler Siparişle koruyarak, şimdi tam olarak aynı şekilde davranıyorlar collections.OrderedDicts kullanılır. Ne yazık ki, indekslemek için özel bir yöntem hala yok keys() / values() Sözlüğün, yani ilk anahtarın / değerin sözlükte alınabilmesi gibi

first_key = list(colors.keys())[0]
first_val = list(colors.values())[0]

veya alternatif olarak (bu, tuşların görünümünü bir listeye ayırmayı önler):

def get_first_key(dictionary):
    for key in dictionary.keys():
        return key

first_key = get_first_key(colors)
first_val = colors[first_key]

Eğer bir ihtiyacınız varsa n-th anahtar, daha sonra benzer

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

37
2018-06-21 23:29



Bağlantıyı ilgili belgelere verebilir misiniz? - Miind
Kesin olmak gerekirse: python 3.6'da bir uygulama detayı. Python 3.7'den beri, Python dil özelliklerinin resmi bir parçası olduğu bildirildi, @Miind doktor - hans


Bir sözlük öğesinin adreslenmesi eşeğe oturmak ve yolculuğun tadını çıkarmak gibidir.

Python'un kuralı olarak SÖZLÜK emirsiz

Varsa

dic = {1: "a", 2: "aa", 3: "aaa"}

Şimdi gidersem gidersem dic[10] = "b"o zaman her zaman böyle olmayacak

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

Gibi olabilir

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

Veya

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

Veya

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

Ya da böyle bir kombinasyon.

Yani başparmak kuralı SÖZLÜK olduğu orderless!


5
2018-03-07 06:56





Aslında bana gerçekten yardımcı olan yeni bir çözüm buldum, Özellikle liste veya veri kümesindeki belirli bir değerin indeksi ile ilgileniyorsanız, sözlüğün değerini bu dizine ayarlayabilirsiniz.

Sadece izle:

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}

Şimdi hashmapların gücü sayesinde, endeksinizi girişlerinizi sabit zamanda (daha hızlı bir şekilde) çekebilirsiniz.


4
2017-11-20 19:02





Sipariş edilen bir sözlüğe ihtiyacınız varsa, kullanabilirsiniz odict.


3
2017-12-01 16:45



odict, keys (), values ​​() veya items () içine indekslemeyi desteklemez. - Konstantin


Yapamazsın dict sırasız. kullanabilirsiniz .popitem() keyfi bir öğe elde etmek için, ancak bu dict gelen kaldırır.


1
2017-12-01 16:41



next(iter(d.items())) (.iteritems() Python 2'de size rastgele bir öğe verir (testlerimde de aynıdır, bu da popitem'in bunu kullanarak uygulanabildiğinden anlamlıdır) ancak öğeyi kaldırmaz.


Sözlükler liste değildir.

sadece listeleri ile yapabilirsiniz   enter foo[0] here bu değeri almak için.

dicts .value ve .keys () fonksiyonlarını aldı.

Aynı zamanda bir taslak ile yinelemek istediğiniz zaman deneyin / hariç kullanmak için daha fazla onaylanabilir.


0
2017-12-01 18:54