Mengakses elemen kamus Python dengan indeks

118

Pertimbangkan dikt seperti

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

Bagaimana cara saya mengakses, misalnya, elemen tertentu dari kamus ini? misalnya, saya ingin mencetak elemen pertama setelah beberapa pemformatan elemen pertama Apple yang dalam kasus kami hanya 'Amerika'?

Informasi tambahan Struktur data di atas dibuat dengan mengurai file input dalam fungsi python. Namun setelah dibuat, itu tetap sama untuk proses itu.

Saya menggunakan struktur data ini dalam fungsi saya.

Jadi jika file berubah, pada saat aplikasi ini dijalankan, konten file akan berbeda sehingga struktur data ini akan berbeda tetapi formatnya akan sama. Jadi Anda lihat saya dalam fungsi saya, saya tidak tahu bahwa elemen pertama di Apple adalah 'Amerika' atau yang lainnya jadi saya tidak bisa langsung menggunakan 'Amerika' sebagai kunci.

alessandra
sumber
2
Bisakah Anda memberikan contoh keluaran yang Anda harapkan?
Björn Pollex
3
Apa yang sebenarnya ingin Anda lakukan dengan struktur ini? Dan apakah Anda tahu kunci dari dict ('Apple' dan 'Grapes' dalam contoh Anda)? Atau apakah Anda hanya tahu bahwa Anda akan mendapatkan diktik?
juanchopanza
6
Jangan panggil kamus Anda dict. Kata 'dict' sudah menjadi kata kunci dalam Python. Gunakan sesuatu yang lain, seperti mydict.
Rick mendukung Monica
Catatan: Pertanyaan ini tentang mengakses elemen dict dengan indeks , yang tidak masuk akal karena dicts tidak berurutan. Untuk pertanyaan tentang mengakses elemen dalam dikt bersarang, lihat Python - mengakses nilai yang disarangkan dalam kamus .
Aran-Fey
@ Aran-Fey: hal-hal yang tidak diatur memiliki urutan intrinsik. Unordered! = Tidak ada pesanan.
Jamie Marshall

Jawaban:

123

Mengingat bahwa ini adalah kamus, Anda mengaksesnya dengan menggunakan tombol. Mendapatkan kamus disimpan di bawah "Apple", lakukan hal berikut:

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

Dan mendapatkan berapa banyak dari mereka adalah orang Amerika (16), lakukan seperti ini:

>>> mydict["Apple"]["American"]
'16'
Morten Kristensen
sumber
9
Bagaimana seseorang bisa melakukan ini secara dinamis tanpa mengetahui kedalaman elemen?
Ethan Bierlein
3
Apa sebenarnya yang ingin Anda ketahui? Anda bisa mendapatkan kunci kamus .keys()sehingga Anda dapat mengaksesnya secara dinamis.
Morten Kristensen
3
Seperti, misalnya, jika Anda memiliki kamus dengan kedalaman yang tidak diketahui, misalnya, kamus bertingkat, dan Anda memiliki elemen "n"pada kedalaman yang tidak diketahui, disimpan dalam elemen yang tidak diketahui.
Ethan Bierlein
1
Itu pertanyaan yang sangat luas. Mengingat struktur data Anda, Anda kemudian akan menulis fungsi atau kelas untuk menanganinya dengan tepat. Mungkin Anda bisa memberikan kunci dan strategi untuk mencoba menemukan kuncinya.
Morten Kristensen
1
@EthanBierlein gunakan: 'untuk kunci, nilai dalam kamus.iteritems ()' untuk memiliki akses ke kunci dan nilai
danius
25

Jika pertanyaannya adalah, jika saya tahu bahwa saya memiliki diktik yang berisi 'Apel' sebagai buah dan 'Amerika' sebagai sejenis apel, saya akan menggunakan:

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }


print myDict['Apple']['American']

seperti yang disarankan orang lain. Jika sebaliknya pertanyaannya adalah, Anda tidak tahu apakah 'Apple' sebagai buah dan 'Amerika' sebagai jenis 'Apple' ada saat Anda membaca file sewenang-wenang ke dalam dict struktur data dict, Anda dapat melakukan sesuatu seperti:

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

atau lebih baik lagi agar Anda tidak perlu mengulang seluruh diktik jika Anda tahu bahwa hanya Apple yang memiliki tipe Amerika:

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

Dalam semua kasus ini, tidak masalah urutan apa yang sebenarnya disimpan kamus. Jika Anda benar-benar khawatir tentang pesanan tersebut, maka Anda dapat mempertimbangkan untuk menggunakanOrderedDict :

http://docs.python.org/dev/library/collections.html#collections.OrderedDict

JoshAdel
sumber
20

Ketika saya melihat deskripsi Anda, Anda hanya tahu bahwa parser Anda akan memberi Anda kamus yang nilainya juga kamus seperti ini:

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

Jadi, Anda harus mengulang kamus induk Anda. Jika Anda ingin mencetak atau mengakses semua kunci kamus pertama dalam sampleDict.values()daftar, Anda dapat menggunakan sesuatu seperti ini:

for key, value in sampleDict.items():
    print value.keys()[0]

Jika Anda hanya ingin mengakses kunci pertama dari item pertama masuk sampleDict.values(), ini mungkin berguna:

print sampleDict.values()[0].keys()[0]

Jika Anda menggunakan contoh yang Anda berikan dalam pertanyaan, maksud saya:

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

Output untuk kode pertama adalah:

American
Indian

Dan keluaran dari kode kedua adalah:

American
Zeinab Abbasimazar
sumber
10

Sebagai bonus, saya ingin menawarkan solusi berbeda untuk masalah Anda. Anda tampaknya berurusan dengan kamus bersarang, yang biasanya membosankan, terutama ketika Anda harus memeriksa keberadaan kunci dalam.

Ada beberapa perpustakaan menarik tentang ini di pypi, berikut adalah pencarian cepat untuk Anda.

Dalam kasus khusus Anda, dict_digger tampaknya cocok.

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None
Flavian Hautbois
sumber
8

Anda dapat menggunakan dict['Apple'].keys()[0]untuk mendapatkan kunci pertama di Applekamus, tetapi tidak ada jaminan bahwa itu akan terjadi American. Urutan kunci dalam kamus dapat berubah tergantung pada konten kamus dan urutan tombol ditambahkan.

Gabe
sumber
kecuali jika Anda gunakan OrderedDictdi collectionsperpustakaan
Escachator
7

Saya tahu ini berusia 8 tahun, tetapi tampaknya tidak ada yang benar-benar membaca dan menjawab pertanyaan itu.

Anda dapat memanggil .values ​​() pada sebuah dict untuk mendapatkan daftar dari dalam dicts dan dengan demikian mengaksesnya dengan index.

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']
Jamie Marshall
sumber
2
menarik, saya mencoba ini dan mendapatkannya 'dict_values' object does not support indexing . Tebak jawaban ini perlu diperbarui karena Anda perlu membungkus dict_values ​​untuk memulihkan daftar
Yuca
1
@Yucca - Anda benar, saya tidak menguji kode saya. Jawabannya telah diperbarui
Jamie Marshall
2

Contoh Sederhana untuk memahami cara mengakses elemen dalam kamus: -

Buat Kamus

d = {'dog' : 'bark', 'cat' : 'meow' } 
print(d.get('cat'))
print(d.get('lion'))
print(d.get('lion', 'Not in the dictionary'))
print(d.get('lion', 'NA'))
print(d.get('dog', 'NA'))

Jelajahi lebih lanjut tentang Kamus Python dan pelajari secara interaktif di sini ...

Manish Methani
sumber
1

Hanya sedikit orang yang muncul, terlepas dari banyaknya jawaban untuk pertanyaan ini, telah menunjukkan bahwa kamus adalah pemetaan yang tidak berurutan, dan karenanya (sampai berkat urutan penyisipan dengan Python 3.7) gagasan entri "pertama" dalam kamus secara harfiah dibuat tidak masuk akal. Dan bahkan OrderedDicthanya dapat diakses oleh indeks numerik menggunakan keburukan seperti mydict[mydict.keys()[0]](hanya Python 2, karena dalam Python 3 keys()adalah iterator non-subskrip.)

Mulai 3.7 dan seterusnya dan dan dalam praktik di 3,6 juga - perilaku baru diperkenalkan kemudian, tetapi tidak termasuk sebagai bagian dari spesifikasi bahasa sampai 3,7 - iterasi atas kunci, nilai atau item dari suatu dikt (dan, saya percaya, a set juga) akan menghasilkan objek yang paling terakhir disisipkan terlebih dahulu. Masih belum ada cara sederhana untuk mengaksesnya dengan indeks penyisipan numerik.

Mengenai pertanyaan memilih dan "memformat" item, jika Anda mengetahui kunci yang ingin Anda ambil dalam kamus, biasanya Anda akan menggunakan kunci tersebut sebagai subskrip untuk mengambilnya ( my_var = mydict['Apple']).

Jika Anda benar-benar ingin mengindeks item dengan nomor entri (mengabaikan fakta bahwa nomor entri tertentu akan berubah saat penyisipan dibuat) maka struktur yang sesuai mungkin adalah daftar tupel dua elemen. Dari pada

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

Anda mungkin menggunakan:

mylist = [
    ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
    ('Grapes', {'Arabian': '25', 'Indian': '20'}
]

Di bawah rezim ini entri pertama adalah mylist[0]dalam bentuk daftar-berakhir klasik, dan nilainya ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}). Anda dapat mengulang seluruh daftar sebagai berikut:

for (key, value) in mylist:  # unpacks to avoid tuple indexing
    if key == 'Apple':
        if 'American' in value:
            print(value['American'])

tetapi jika Anda tahu Anda mencari kunci "Apple", mengapa Anda tidak menggunakan dict saja?

Anda dapat memperkenalkan tingkat tipuan tambahan dengan menyimpan daftar kunci ke dalam cache, tetapi kerumitan dalam menjaga dua struktur data dalam sinkronisasi pasti akan menambah kompleksitas kode Anda.

holdenweb
sumber
0

Dengan fungsi kecil berikut, menggali kamus berbentuk pohon menjadi sangat mudah:

def dig(tree, path):
    for key in path.split("."):
        if isinstance(tree, dict) and tree.get(key):
            tree = tree[key]
        else:
            return None
    return tree

Sekarang, dig(mydict, "Apple.Mexican")kembali 10, sementara dig(mydict, "Grape")menghasilkan subtree {'Arabian':'25','Indian':'20'}. Jika kunci tidak ada dalam kamus, digkembaliNone .

Perhatikan bahwa Anda dapat dengan mudah mengubah (atau bahkan membuat parameter) karakter pemisah dari '.' ke '/', '|' dll.

Heinrich mendukung Monica
sumber