Bagaimana cara mengindeks ke dalam kamus?

97

Saya memiliki kamus di bawah ini:

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

Bagaimana cara mengindeks entri pertama dalam kamus?

colors[0]akan mengembalikan KeyErroruntuk alasan yang jelas.

Harpal
sumber
4
Apa artinya "pertama"? Kamus tidak memiliki urutan.
S. Lott
2
Kamus sekarang dipesan penyisipan sejak Python 3.7 Lihat ini: stackoverflow.com/questions/39980323/…
Nikita Alkhovik
1
@ S.Lott Saya yakin dia tidak akan bertanya jika dia tahu mereka tidak dipesan :).
pengguna7778287

Jawaban:

113

Kamus tidak diurutkan dalam versi Python hingga dan termasuk Python 3.6. Jika Anda tidak peduli dengan urutan entri dan tetap ingin mengakses kunci atau nilai menurut indeks, Anda dapat menggunakan d.keys()[i]dan d.values()[i]atau d.items()[i]. (Perhatikan bahwa metode ini membuat daftar semua kunci, nilai, atau item dengan Python 2.x. Jadi jika Anda membutuhkannya lebih dari sekali, simpan daftar dalam variabel untuk meningkatkan kinerja.)

Jika Anda benar-benar peduli dengan urutan entri, mulai dengan Python 2.7 Anda dapat menggunakan collections.OrderedDict. Atau gunakan daftar pasangan

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

jika Anda tidak membutuhkan akses dengan kunci. (Ngomong-ngomong, mengapa nomor Anda berdering?)

Di Python 3.7, kamus normal disusun, jadi Anda tidak perlu menggunakan OrderedDictlagi (tapi Anda masih bisa - pada dasarnya tipe yang sama). Implementasi CPython dari Python 3.6 sudah termasuk perubahan itu, tetapi karena itu bukan bagian dari spesifikasi bahasa, Anda tidak dapat mengandalkannya di Python 3.6.

Sven Marnach
sumber
2
Dalam Python 2, gunakan d.iterkeys().next()bukan d.keys()[0]untuk memeriksa salah satu kunci tanpa menghapusnya. Jika kamusnya sangat besar, itu akan membuat perbedaan besar dalam hal kinerja. Hal yang sama berlaku untuk nilai dan item. Di Python 2.7 Anda juga dapat menggunakan objek tampilan dict
simleo
44
Dalam Python 3, panggilan ini mengembalikan tampilan, bukan daftar sebenarnya sehingga Anda harus menggabungkannya dalam panggilan ke list () jika tidak, Anda akan melihat: "TypeError: objek 'dict_values' tidak mendukung pengindeksan". Lihat pertanyaan SO ini: stackoverflow.com/questions/17431638/…
stifin
3
Hanya sedikit koreksi: Anda tidak dapat mengindeks item (), setidaknya tidak dengan Python 3.
John Strong
1
Jawaban ini sudah ketinggalan zaman untuk python 3.6+, silakan lihat jawaban oleh @Pasha di bawah ini.
hans
1
@hans Jawaban ini sudah ketinggalan zaman untuk Python 3.7, tetapi tidak untuk Python 3.6, karena sifat kamus yang menjaga urutan adalah detail implementasi implementasi CPython dari versi Python itu, bukan bagian resmi dari bahasa tersebut. Saya akan memperbarui jawaban ini sesuai.
Sven Marnach
115

Jika ada yang masih melihat pertanyaan ini, jawaban yang diterima saat ini sudah usang:

Sejak Python 3.7 * kamus-kamusnya menjaga urutan , yaitu mereka sekarang berperilaku persis seperti collections.OrderedDictdulu. Sayangnya, masih belum ada metode khusus untuk mengindeks ke keys()/ values()dari kamus, jadi mendapatkan kunci / nilai pertama dalam kamus dapat dilakukan seperti

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

atau sebagai alternatif (ini untuk menghindari membuat tampilan kunci menjadi daftar):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

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

Jika Anda membutuhkan nkunci -th, maka sama saja

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

(* CPython 3.6 sudah termasuk dicts terurut, tapi ini hanya detail implementasi. Spesifikasi bahasa termasuk dicts terurut dari 3.7 dan seterusnya.)

Pasha
sumber
Bisakah berikan tautan ke dokumentasi yang sesuai?
Amir Afianian
3

Mengatasi elemen kamus seperti duduk di atas keledai dan menikmati perjalanan.

Aturan Python DICTIONARY tidak beraturan

Jika ada

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

Sekarang misalkan jika saya pergi seperti dic[10] = "b", maka itu tidak akan selalu menambahkan seperti ini

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

Mungkin seperti itu

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

Atau

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

Atau

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

Atau kombinasi semacam itu.

Jadi aturan jempol adalah KAMUS tidak teratur !

Raj Damani
sumber
ini sangat sulit ... Saya menyukainya!
Alex Liu 33214
2

Jika Anda membutuhkan kamus yang teratur, Anda dapat menggunakan odict .

Utku Zihnioglu
sumber
odict melihat untuk tidak mendukung pengindeksan ke dalam keys (), values ​​(), atau items ().
Konstantin
2

sebenarnya saya menemukan solusi baru yang sangat membantu saya, Jika Anda sangat peduli dengan indeks nilai tertentu dalam daftar atau kumpulan data, Anda dapat menetapkan nilai kamus ke Indeks itu !:

Hanya melihat:

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}

Sekarang melalui kekuatan hashmaps Anda dapat menarik indeks entri Anda dalam waktu yang konstan (alias jauh lebih cepat)

pengguna3368835
sumber
1

oh, itu yang sulit. Apa yang Anda miliki di sini, pada dasarnya, adalah dua nilai untuk setiap item. Kemudian Anda mencoba memanggil mereka dengan nomor sebagai kuncinya. Sayangnya, salah satu nilai Anda telah ditetapkan sebagai kuncinya!

Coba ini:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

Sekarang Anda dapat memanggil kunci dengan nomor seolah-olah mereka diindeks seperti daftar. Anda juga dapat merujuk warna dan nomor dengan posisinya di dalam daftar.

Sebagai contoh,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

Tentu saja, Anda harus menemukan cara lain untuk melacak lokasi tiap warna. Mungkin Anda bisa memiliki kamus lain yang menyimpan kunci setiap warna sebagai nilainya.

colors_key = {'blue': 1, 'red': 6, 'yllow': 8}

Kemudian, Anda juga dapat mencari kunci warna jika perlu.

colors [colors_key ['blue']] [0] akan menghasilkan 'blue'

Sesuatu seperti itu.

Dan kemudian, saat Anda melakukannya, Anda dapat membuat dikt dengan nilai angka sebagai kunci sehingga Anda selalu dapat menggunakannya untuk mencari warna Anda, jika perlu.

nilai = {5: [1, 'blue'], 6: [2, 'red'], 8: [3, 'yellow']}

Kemudian, (colors [colors_key [nilai [5] [1]]] [0]) akan mengembalikan 'biru'.

Atau Anda bisa menggunakan daftar daftar.

Semoga berhasil!

Godfreyluck
sumber
0

Anda tidak bisa, karena dicttidak berurutan. Anda dapat menggunakan .popitem()untuk mendapatkan item arbitrer, tetapi itu akan menghapusnya dari dict.

Ignacio Vazquez-Abrams
sumber
next(iter(d.items()))( .iteritems()dengan Python 2) memberi Anda item arbitrer juga (sama dalam pengujian saya, yang masuk akal karena popitem dapat diimplementasikan menggunakan ini) tetapi tidak akan menghapus item tersebut.