Mengetik dalam pengembalian yang dinyatakan? Kalau tidak, mengapa 321? Bukankah seharusnya 320?
GreenMatt
3
@myself: Oke, sekarang saya mengerti - apa yang diinginkan adalah kunci untuk entri di mana nilai entri adalah minimum. Lebih baik kata-kata untuk pertanyaan itu, karena orang lain jelas berpikir sama seperti saya.
GreenMatt
2
Hari kesadaran struktur data: jika Anda hanya meminta (atau menghapus) elemen minimum, pertimbangkan untuk menggunakan antrian atau tumpukan prioritas.
Kolonel Panic
Jawaban:
597
Terbaik: min(d, key=d.get)- tidak ada alasan untuk menempatkan lambdalapisan tipuan yang tidak berguna atau mengekstrak item atau kunci!
@ KarelBílek artinya Anda memasukkan sebagai "d" daftar misalnya [11, 22, 33], bukan kamus misalnya {1: 11, 2:22, 3:33}. 'd.get' valid untuk kamus, tetapi tidak untuk daftar.
ToolmakerSteve
9
bagaimana jika dua kunci berbeda memiliki nilai yang sama? dan mereka berdua menjadi nilai terkecil? bagaimana Anda bisa mengembalikan keduanya?
user3226932
5
Bisakah teknik ini digunakan jika nilai dict adalah daftar, misalnya:, di d={"a":[10, None], "b":[20, None]}mana min dihitung dari d [kunci] [0]?
TrakJohnson
4
Bagaimana cara kerjanya? Seperti apa fungsi min itu, saya pikir min () hanya mengambil nilai individual atau daftar sebagai argumen. Bagaimana cara mengulang semua entri dalam kamus?
azureai
2
min()kembalikan nilai pada nilai pertama diurutkan. kunci menentukan cara untuk mengurutkan nilai. key=d.getberarti daftar akan diurutkan berdasarkan nilai kamus.
notilas
45
Inilah jawaban yang benar-benar memberikan solusi yang diminta OP:
>>> d ={320:1,321:0,322:3}>>> d.items()[(320,1),(321,0),(322,3)]>>># find the minimum by comparing the second element of each tuple>>> min(d.items(), key=lambda x: x[1])(321,0)
Namun, penggunaan d.iteritems()akan lebih efisien untuk kamus yang lebih besar.
Jawaban Anda sangat berguna dan orang lain mungkin setuju: lihat beberapa komentar untuk hal itu dalam jawaban yang diterima. Namun, saya perlu kembali dua kali untuk menemukannya: apakah Anda akan mempertimbangkan untuk mengusulkan edit pada jawaban yang diterima? Milikmu sebenarnya saling melengkapi.
Tidak benar-benar layak mendapatkan downvote, karena pertanyaan asli poster itu tidak sejelas mungkin.
GreenMatt
@ Space_C0wb0y: mungkin Anda bisa berbaik hati memperhatikan bahwa OP mengedit pertanyaannya untuk mengartikan sesuatu yang berbeda, setelah saya menjawab
Eli Bendersky
3
Pendekatan lain untuk mengatasi masalah beberapa kunci dengan nilai min yang sama:
>>> dd ={320:1,321:0,322:3,323:0}>>>>>>from itertools import groupby
>>>from operator import itemgetter
>>>>>>print[v for k,v in groupby(sorted((v,k)for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]][321,323]
Gunakan mindengan iterator (untuk penggunaan python 3 itemsbukan iteritems); bukannya lambda gunakan itemgetterdari operator, yang lebih cepat dari lambda.
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
untuk membuat kelas yang dapat dipesan, Anda harus mengganti 6 fungsi khusus, sehingga akan dipanggil oleh fungsi min ()
metode-metode ini __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__agar mereka kurang dari, kurang dari atau sama, lebih besar dari, lebih besar dari atau sama, sama, tidak sama. misalnya Anda harus menerapkan __lt__sebagai berikut:
Gunakan fungsi zip untuk membuat iterator tuple yang berisi nilai dan kunci. Kemudian bungkus dengan fungsi min yang mengambil minimum berdasarkan kunci pertama. Ini mengembalikan tuple yang berisi pasangan (nilai, kunci). Indeks [1] digunakan untuk mendapatkan kunci yang sesuai
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
β.εηοιτ.βε
@ β.εηοιτ.βε lebih baik?
rajn
-1
# python
d={320:1,321:0,322:3}
reduce(lambda x,y: x if d[x]<=d[y]else y, d.iterkeys())321
1) Mengurangi umumnya lebih lambat dari itertools. 2) Sebagian besar implementasi pengurangan dapat dilakukan lebih sederhana dengan apa pun atau semua. 3) Saya adalah juru bicara raksasa untuk GvR. 4) Modul operator membuat lambda paling sederhana tidak perlu, dan lambda kompleks harus didefinisikan sebagai fungsi nyata. Mungkin saya hanya takut pemrograman fungsional. ;)
MikeD
@miked: ceritakan lebih banyak. apa gvr dan apa modul operator? bisakah Anda memposting tautan? saya mungkin mengenal orang lain, tapi saya masih perantara di python. berminat untuk belajar! :-)
eruciform
GvR adalah Guido van Rossum, diktator kebajikan Python untuk seumur hidup. Berikut ini adalah pos berusia lima tahun dari dia yang menjelaskan mengapa lisp-isme (peta, filter, kurangi, lambda) tidak memiliki banyak tempat di python maju, dan alasan-alasan itu masih berlaku sampai sekarang. Modul operator memiliki penggantian untuk mengekstraksi anggota : "lambda x: x [1]" dibandingkan dengan "itemgetter (1)" adalah karakter yang lebih panjang dan bisa dibilang membutuhkan waktu lebih lama untuk dipahami. Saya kehabisan ruang, tetapi ajukan pertanyaan!
Jawaban:
Terbaik:
min(d, key=d.get)
- tidak ada alasan untuk menempatkanlambda
lapisan tipuan yang tidak berguna atau mengekstrak item atau kunci!sumber
[11, 22, 33]
, bukan kamus misalnya{1: 11, 2:22, 3:33}
. 'd.get' valid untuk kamus, tetapi tidak untuk daftar.d={"a":[10, None], "b":[20, None]}
mana min dihitung dari d [kunci] [0]?min()
kembalikan nilai pada nilai pertama diurutkan. kunci menentukan cara untuk mengurutkan nilai.key=d.get
berarti daftar akan diurutkan berdasarkan nilai kamus.Inilah jawaban yang benar-benar memberikan solusi yang diminta OP:
Namun, penggunaan
d.iteritems()
akan lebih efisien untuk kamus yang lebih besar.sumber
operator.itemgetter(1)
.Untuk beberapa kunci yang memiliki nilai terendah yang sama, Anda dapat menggunakan pemahaman daftar:
Versi fungsional yang setara:
sumber
min(d.items(), key=lambda x: x[1])[0]
sumber
sumber
key=d.get
lebih baik.Untuk kasus di mana Anda memiliki beberapa kunci minimal dan ingin membuatnya tetap sederhana
sumber
Jika Anda tidak yakin bahwa Anda tidak memiliki beberapa nilai minimum, saya sarankan:
sumber
Sunting: ini adalah jawaban untuk pertanyaan awal OP tentang kunci minimal, bukan jawaban minimal.
Anda bisa mendapatkan kunci dikt menggunakan
keys
fungsi, dan Anda benar tentang menggunakanmin
untuk menemukan minimum daftar itu.sumber
Pendekatan lain untuk mengatasi masalah beberapa kunci dengan nilai min yang sama:
sumber
Gunakan
min
dengan iterator (untuk penggunaan python 3items
bukaniteritems
); bukannya lambda gunakanitemgetter
dari operator, yang lebih cepat dari lambda.sumber
sumber
Saya membandingkan kinerja tiga opsi berikut:
Output sampel:
sumber
untuk membuat kelas yang dapat dipesan, Anda harus mengganti 6 fungsi khusus, sehingga akan dipanggil oleh fungsi min ()
metode-metode ini
__lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
agar mereka kurang dari, kurang dari atau sama, lebih besar dari, lebih besar dari atau sama, sama, tidak sama. misalnya Anda harus menerapkan__lt__
sebagai berikut:maka Anda dapat menggunakan fungsi min sebagai berikut:
ini berhasil untuk saya.
sumber
Gunakan fungsi zip untuk membuat iterator tuple yang berisi nilai dan kunci. Kemudian bungkus dengan fungsi min yang mengambil minimum berdasarkan kunci pertama. Ini mengembalikan tuple yang berisi pasangan (nilai, kunci). Indeks [1] digunakan untuk mendapatkan kunci yang sesuai
sumber
sumber
min()
).Apa ini yang kamu cari?
Cetakan 'empat belas'
sumber