Bagaimana Anda menemukan kunci pertama dalam kamus?

200

Saya mencoba membuat program saya untuk dicetak "banana"dari kamus. Apa cara paling sederhana untuk melakukan ini?

Ini kamus saya:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
Slagoy
sumber
35
Kamus dengan Python tidak teratur, sehingga tidak ada "kunci pertama". Lihat di sini
David Robinson
2
Apakah Anda ingin mencetak secara harfiah kata "pisang" atau nilai yang dikaitkan dengan "pisang" (4, dalam hal ini)?
Paul H
to print out banana with a FOR loop, so when I run it, each key would also be printed outApakah yang Anda maksud for k in prices: print k? Itu akan mencetak semua kunci dalam kamus.
David Robinson
7
ke komentar pertama: dalam python 3.6+ kamus dipesan (lihat stackoverflow.com/questions/39980323/… )
Egirus Ornila

Jawaban:

284

Pada versi Python di mana perintah sebenarnya dipesan, Anda bisa melakukannya

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Agar diktat dipesan, Anda perlu Python 3.7+, atau 3.6+ jika Anda tidak keberatan dengan mengandalkan sifat teknis-an-implementasi-detail yang dipesan dari dikt pada Python 3.6.

Untuk versi Python sebelumnya, tidak ada "kunci pertama".

maxbellec
sumber
29
Jika Anda ingin kunci dan nilai dalam Python 3:next(iter( my_dict.items() ))
Jonathan H
@RyanHaining Python dicts dipesan melalui penyisipan yang dimulai dengan CPython 3.6 dan implementasi Python lainnya dimulai dengan Python 3.7
Boris
1
jawaban ini mengacaukan sesi debug saya bahwa saya menunggu 6 jam untuk sampai ke breakpoint. Ini sangat menjengkelkan.
Michael
128

Kamus tidak diindeks, tetapi dalam beberapa cara, dipesan. Berikut ini akan memberi Anda kunci pertama yang ada:

list(my_dict.keys())[0]
Yor
sumber
25
Bukankah itu lebih mudah untuk dimasukkan list(my_dict)[0]karena akan mengambil daftar kunci?
Jean-Francois T.
@ Jean-FrancoisT. ya
Ryan Haining
Kamus sekarang dipesan dalam CPython 3.6 dan semua implementasi Python lainnya dimulai dengan Python 3.7
Boris
53

Pembaruan: pada Python 3.7, urutan penyisipan dipertahankan, sehingga Anda tidak perlu di OrderedDictsini. Anda dapat menggunakan pendekatan di bawah ini dengan normaldict

Diubah dalam versi 3.7: Urutan kamus dijamin menjadi urutan penyisipan. Perilaku ini merupakan detail implementasi dari CPython dari 3.6.

sumber


Python 3.6 dan sebelumnya *

Jika Anda berbicara tentang reguler dict, maka "kunci pertama" tidak berarti apa-apa. Kunci tidak dipesan dengan cara apa pun yang dapat Anda andalkan. Jika Anda mengulanginya, dictkemungkinan besar Anda tidak akan mendapatkan "banana"hal pertama yang Anda lihat.

Jika Anda perlu menjaga semuanya, maka Anda harus menggunakan OrderedDictdan bukan hanya kamus biasa.

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Jika Anda kemudian ingin melihat semua kunci agar Anda bisa melakukannya dengan mengulanginya

for k in prices:
    print(k)

Anda bisa, atau memasukkan semua kunci ke dalam daftar dan kemudian bekerja dengan itu

ks = list(prices)
print(ks[0]) # will print "banana"

Cara yang lebih cepat untuk mendapatkan elemen pertama tanpa membuat daftar adalah memanggil nextiterator. Ini tidak menggeneralisasi dengan baik ketika mencoba untuk mendapatkan nthelemen

>>> next(iter(prices))
'banana'

* CPython telah menjamin pesanan penyisipan sebagai detail implementasi dalam 3.6.

Ryan Haining
sumber
Terima kasih atas sarannya. Saya minta maaf karena tidak lebih jelas. Saya hanya mencoba menemukan kode yang akan membiarkan saya mencetak "Pisang" BUKAN nilai yang terkait dengannya. Terima kasih atas semua masukan!
slagoy
31

Untuk Python 3 di bawah ini menghilangkan overhead dari konversi daftar:

first = next(iter(prices.values()))
Shital Shah
sumber
10

The dictjenis adalah unordered pemetaan, sehingga tidak ada hal seperti itu sebagai "pertama" elemen.

Apa yang Anda inginkan mungkin collections.OrderedDict.


sumber
atau sebuah nameduple mungkin jika itu tidak berubah
Joran Beasley
Ini telah berubah sejak Python 3.6. Kamus sekarang dipesan.
misantroop
1
Yah secara teknis, Anda ingin elemen pertama dari kunci kamus jika Anda yakin, hanya ada satu kunci.
DBX12
orang bisa mengatakan item pertama sambil mengulangi dict yang jika diperbaiki. Tapi semoga berhasil menemukan yang satu itu.
demongolem
6

Jadi saya menemukan halaman ini ketika mencoba untuk mengoptimalkan sesuatu untuk mengambil satu-satunya kunci dalam kamus yang diketahui panjang 1 dan hanya mengembalikan kunci. Proses di bawah ini adalah yang tercepat untuk semua kamus yang saya coba hingga ukuran 700.

Saya mencoba 7 pendekatan berbeda, dan menemukan bahwa ini adalah yang terbaik, pada Macbook 2014 saya dengan Python 3.6:

def first_5():
    for key in biased_dict:
        return key

Hasil dari profil mereka adalah:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

Semua pendekatan yang saya coba ada di sini:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key
turiyag
sumber
1
Jadi melakukan for for dan mengembalikan kunci pertama (first_5) sebenarnya yang tercepat seperti yang saya lihat? Juga perbandingan yang bagus dari pendekatan yang berbeda.
PiMathCLanguage
1
ya, dan bukan hanya yang tercepat, tetapi tercepat dengan jarak tempuh mil. Juga yang paling mudah dibaca, nyaman.
turiyag
4

Sekalipun sederhana, jawabannya menurut saya adalah

first = list(prices)[0]

mengonversi kamus ke daftar akan menampilkan kunci dan kami akan memilih kunci pertama dari daftar.

narwanimonish
sumber
Untuk python3, tidak perlu membuat daftar baru untuk mengambil hanya elemen pertama. Penggunaan yang lebih baik next(iter(prices)), seperti yang sudah disarankan oleh jawaban lain.
normanius
1

Seperti yang telah ditunjukkan oleh banyak orang lain, tidak ada nilai pertama dalam kamus. Pengurutan di dalamnya sewenang-wenang dan Anda tidak dapat mengandalkan pengurutan yang sama setiap kali Anda mengakses kamus. Namun jika Anda ingin mencetak kunci ada beberapa cara untuk itu:

for key, value in prices.items():
    print(key)

Metode ini menggunakan penugasan tuple untuk mengakses kunci dan nilainya. Ini berguna jika Anda perlu mengakses kunci dan nilai karena suatu alasan.

for key in prices.keys():
    print(key)

Ini hanya akan memberikan akses ke kunci sesuai dengan keys()metode.

kylie.a
sumber
1

d.keys () [0] untuk mendapatkan kunci individual.

Pembaruan: - @AlejoBernardin, saya tidak yakin mengapa Anda mengatakan itu tidak berhasil. di sini saya memeriksa dan berhasil. mengimpor koleksi

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'pisang'

Amit Sharma
sumber
Dengan jumlah suara, mengapa ini bukan solusi terbaik yang baik?
GuSuku
18
Ini berfungsi di python2 tetapi tidak python3. Di python3, dict.keys()mengembalikan 'dict_keys' objectbukan list, yang tidak mendukung pengindeksan.
mavix
TypeError: objek 'dict_keys' tidak mendukung pengindeksan
anilbey
0

Gunakan for for yang berkisar melalui semua kunci di prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Pastikan Anda mengubah prices.items()ke prices.iteritems()jika Anda menggunakan Python 2.x

Markus M
sumber
0

Jika Anda hanya ingin kunci pertama dari kamus, Anda harus menggunakan apa yang disarankan banyak orang sebelumnya

first = next(iter(prices))

Namun, jika Anda menginginkan yang pertama dan menyimpan sisanya sebagai daftar, Anda dapat menggunakan nilai-nilai operator pembongkaran

first, *rest = prices

Hal yang sama berlaku pada nilai dengan mengganti pricesdengan prices.values()dan untuk kedua kunci dan nilai Anda bahkan dapat menggunakan tugas membongkar

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Catatan: Anda mungkin tergoda untuk menggunakan first, *_ = priceshanya mendapatkan kunci pertama, tetapi saya biasanya akan menyarankan terhadap penggunaan ini kecuali kamus sangat pendek karena itu loop atas semua kunci dan membuat daftar untuk restmemiliki beberapa overhead.

Catatan: Seperti yang disebutkan oleh orang lain, urutan penyisipan diawetkan dari python 3.7 (atau secara teknis 3.6) dan di atasnya sedangkan implementasi sebelumnya harus dianggap sebagai urutan yang tidak ditentukan.

wihlke
sumber
-3

Cara termudah adalah:

first_key = my_dict.keys()[0]

tetapi beberapa kali Anda harus lebih berhati-hati dan memastikan bahwa entitas Anda adalah daftar yang berharga jadi:

first_key = list(my_dict.keys())[0]
nasim seifi
sumber
3
Itu memunculkan TypeError: 'dict_keys' object is not subscriptable, setidaknya dengan Python 3.8
Eerik Sven Puudist