Saya punya dictionary
: kunci adalah string, nilai adalah bilangan bulat.
Contoh:
stats = {'a':1000, 'b':3000, 'c': 100}
Saya ingin mendapat 'b'
jawaban, karena itu kuncinya dengan nilai yang lebih tinggi.
Saya melakukan hal berikut, menggunakan daftar perantara dengan tupel nilai kunci terbalik:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
Apakah itu pendekatan yang lebih baik (atau bahkan lebih elegan)?
python
dictionary
max
ricafeal
sumber
sumber
max(stats)
?max(stats)
akan menggunakan label sebagai kunci (itu akan kembali'c'
, mengingat itu label maksimum),max(stats, key=lambda key: stats[key])
adalah apa yang OP inginkan (yang akan kembali'b'
, label nilai indeks maksimal). Apakah ini lebih jelas?Jawaban:
Anda dapat menggunakannya
operator.itemgetter
untuk itu:Dan bukannya membangun daftar baru dalam penggunaan memori
stats.iteritems()
. Thekey
parameter kemax()
fungsi adalah fungsi yang menghitung kunci yang digunakan untuk menentukan bagaimana peringkat item.Harap dicatat bahwa jika Anda memiliki pasangan nilai kunci lain 'd': 3000 bahwa metode ini hanya akan mengembalikan salah satu dari keduanya meskipun keduanya memiliki nilai maksimum.
Jika menggunakan Python3:
sumber
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
sumber
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
Saya telah menguji varian BANYAK, dan ini adalah cara tercepat untuk mengembalikan kunci dict dengan nilai maks:
Untuk memberi Anda ide, berikut adalah beberapa metode kandidat:
Kamus uji:
Dan hasil tes di bawah Python 3.2:
Dan di bawah Python 2.7:
Anda dapat melihat bahwa
f1
ini adalah yang tercepat di bawah Python 3.2 dan 2.7 (atau, lebih lengkap,keywithmaxval
di bagian atas posting ini)sumber
f7
sepertif1
, hanya saja tidak memberi nama ke objek perantara.f7
harus (sangat sedikit) lebih cepat daripadaf1
, tidak jauh lebih lambat. Dan itulah yang saya dapatkan:>>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
Jika Anda hanya perlu mengetahui kunci dengan nilai maksimal, Anda dapat melakukannya tanpa
iterkeys
atauiteritems
karena iterasi melalui kamus di Python adalah iterasi melalui kunci itu.EDIT:
Dari komentar, @ user1274878:
Ya...
maks
key
Argumen opsional menjelaskan cara membandingkan elemen untuk mendapatkan maksimum di antara mereka:Nilai yang dikembalikan akan dibandingkan.
Diktik
Python dict adalah tabel hash. Kunci dikt adalah hash dari objek yang dideklarasikan sebagai kunci. Karena alasan kinerja iterasi meskipun diktat diterapkan sebagai iterasi melalui kunci itu.
Oleh karena itu kita dapat menggunakannya untuk menghilangkan operasi mendapatkan daftar kunci.
Penutupan
The
stats
variabel tersedia melalui__closure__
atribut darilambda
fungsi sebagai pointer dengan nilai variabel yang didefinisikan dalam lingkup induk.sumber
Contoh:
jika Anda ingin menemukan nilai maksimal dengan kuncinya, mungkin follwing bisa sederhana, tanpa fungsi yang relevan.
output adalah kunci yang memiliki nilai maksimal.
sumber
Ini satu lagi:
Fungsi ini
key
hanya mengembalikan nilai yang harus digunakan untuk peringkat danmax()
mengembalikan elemen yang diminta segera.sumber
max(stats, key=lambda k: stats[k])
Jika Anda tidak peduli dengan nilai (saya akan terkejut, tetapi) Anda dapat melakukannya:
Saya suka tuple membongkar lebih baik daripada subscript [0] di akhir ekspresi. Saya tidak pernah suka keterbacaan ekspresi lambda sangat banyak, tetapi menemukan ini lebih baik daripada operator.itemgetter (1) IMHO.
sumber
_
dapat digunakan sebagai gantiignored
.ignored
terlihat sangat jelek, tetapi beberapa orang menentang penggunaan_
karena beberapa alasan. Saya pikir cuplikan pertama baik-baik saja walaupun Anda mengabaikan nilainyaMengingat bahwa lebih dari satu entri saya memiliki nilai maksimal. Saya akan membuat daftar kunci yang memiliki nilai maks sebagai nilainya.
Ini akan memberi Anda 'b' dan kunci maks lainnya juga.
Catatan: Untuk python 3 gunakan
stats.items()
sebagai gantistats.iteritems()
sumber
max
itu mahal (misalnya, kamus PANJANG) saya sarankan[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
jika Anda ingin one-liner, jika tidak hitungm = ...
terlebih dahulu.Kamu bisa menggunakan:
Untuk mengembalikan kunci, gunakan pasangan nilai:
sumber
Untuk mendapatkan kunci / nilai maksimum kamus
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Tentu saja, jika Anda hanya ingin mendapatkan kunci atau nilai dari hasilnya, Anda dapat menggunakan pengindeksan tuple. Misalnya, untuk mendapatkan kunci yang sesuai dengan nilai maksimum:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
Penjelasan
Metode kamus
items()
di Python 3 mengembalikan objek tampilan kamus. Ketika objek tampilan ini diulang, denganmax
fungsi, itu menghasilkan item kamus sebagai tupel formulir(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Saat Anda menggunakan
lambda
ekspresilambda x: x[1]
, di setiap iterasi,x
adalah salah satu dari tupel ini(key, value)
. Jadi, dengan memilih indeks yang tepat, Anda memilih apakah Anda ingin membandingkan dengan kunci atau dengan nilai.Python 2
Untuk rilis Python 2.2+, kode yang sama akan berfungsi. Namun, lebih baik menggunakan
iteritems()
metode kamus daripadaitems()
untuk kinerja.Catatan
Jawaban ini didasarkan pada komentar pada jawaban Climbs_lika_Spyder .
Kode yang digunakan diuji pada Python 3.5.2 dan Python 2.7.10.
sumber
sumber
Per solusi yang diulang melalui komentar di jawaban yang dipilih ...
Dengan Python 3:
Dengan Python 2:
sumber
Saya sampai di sini mencari cara mengembalikan
mydict.keys()
berdasarkan nilaimydict.values()
. Alih-alih hanya satu kunci yang dikembalikan, saya mencari untuk mengembalikan x atas jumlah nilai .Solusi ini lebih sederhana daripada menggunakan
max()
fungsi dan Anda dapat dengan mudah mengubah jumlah nilai yang dikembalikan:Jika Anda ingin kunci peringkat tertinggi tunggal, cukup gunakan indeks:
Jika Anda ingin dua kunci peringkat teratas, cukup gunakan pemotongan daftar:
sumber
max()
. Jelas itu yang tercepat. Saya pikir saya akan menawarkan solusi yang berbeda dengan manfaat mengiris, yang lebih berguna bagi saya pada saat ituSaya tidak puas dengan jawaban ini.
max
selalu mengambil kunci pertama dengan nilai maksimal. Kamus dapat memiliki beberapa kunci dengan nilai itu.Posting jawaban ini jika itu membantu seseorang. Lihat posting SO di bawah ini
Maksimum manakah yang dipilih oleh Python untuk dasi?
sumber
Dengan
collections.Counter
Anda bisa melakukannyaJika sesuai, Anda bisa mulai dengan yang kosong
collections.Counter
dan menambahkannyasumber
Heap queue adalah solusi umum yang memungkinkan Anda untuk mengekstrak kunci n atas yang diurutkan berdasarkan nilai:
Catatan
dict.__getitem__
adalah metode yang disebut oleh gula sintaksisdict[]
. Berbeda dengandict.get
, itu akan kembaliKeyError
jika kunci tidak ditemukan, yang di sini tidak dapat terjadi.sumber
max((value, key) for key, value in stats.items())[1]
sumber
+1 ke @Aric Coady solusi paling sederhana.
Dan juga satu cara untuk secara acak memilih salah satu kunci dengan nilai maksimal dalam kamus:
sumber
sumber
Bagaimana tentang:
sumber
zip(stats.keys(), stats.values())
adalah cara yang lebih panjang untuk menulisstats.items()
. Setelah Anda melakukan perubahan itu, jawaban Anda akan hampir identik dengan beberapa jawaban yang lebih tua.items
tidak sama denganzip
. Itu hanya menghasilkan hasil yang sama.Saya menguji jawaban yang diterima DAN @ solusi manusia serigala terhadap loop yang sangat dasar dan loop lebih cepat dari keduanya:
hasil:
sumber
Untuk pengguna python ilmiah, berikut adalah solusi sederhana menggunakan Pandas:
sumber
Jika Anda memiliki lebih dari satu kunci dengan nilai yang sama, misalnya:
Anda bisa mendapatkan koleksi dengan semua kunci dengan nilai maksimal sebagai berikut:
sumber
Jauh lebih sederhana untuk memahami pendekatan:
Keluaran: ['a', 'g']
Sekarang Anda hanya dapat memilih satu kunci:
sumber