Memilih nilai acak dari kamus

Katakanlah saya memiliki kamus ini:

dict = {'a': 100, 'b': 5, 'c': 150, 'd': 60};

Saya mendapatkan kunci yang memiliki nilai terbesar dengan kode ini:

most_similar = max(dic.iteritems(), key=operator.itemgetter(1))[0]

itu mengembalikan 'c'

Tapi saya ingin memilih kunci acak dari 3 nilai terbesar teratas. Menurut kamus ini 3 teratas adalah:

c
a
d

Itu harus memilih kunci secara acak dari mereka. Bagaimana saya bisa melakukan itu?


person JayGatsby    schedule 10.01.2016    source sumber
comment
Jadi, Anda ingin satu pilihan acak dari kamus? Atau satu pilihan acak dari list yang sudah ada sebelumnya dari 3 kunci teratas? Atau Anda ingin mencari 3 kunci teratas, lalu memilih satu kunci acak darinya?   -  person TigerhawkT3    schedule 10.01.2016
comment
Saya benci menjadi downer, tapi pertanyaan ini mudah dijawab dengan menggabungkan jawaban dari Bagaimana cara memilih item secara acak dari daftar menggunakan Python ? dan 5 nilai maksimum dalam kamus python. Hasilnya, saya tidak memberikan suara negatif, karena hal itu merupakan upaya penelitian yang buruk dalam buku saya. Bisakah Anda menjelaskan bagaimana pertanyaan ini membedakan dirinya dari sekadar menggabungkan keduanya?   -  person jpmc26    schedule 11.01.2016


Jawaban (3)


Jika Anda ingin menemukan 3 kunci teratas dan kemudian mendapatkan salah satu kunci secara acak, saya sarankan menggunakan random.choice dan collections.Counter, seperti ini

>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> from collections import Counter
>>> from random import choice
>>> choice(Counter(d).most_common(3))[0]
'c'

Counter(d).most_common(3) akan mendapatkan tiga nilai teratas dari kamus berdasarkan nilai-nilai objek kamus diteruskan ke sana dan kemudian kami secara acak memilih salah satu nilai yang dikembalikan dan hanya mengembalikan kunci darinya.

person thefourtheye    schedule 10.01.2016
comment
mengenai komentar Anda sebelumnya pada jawaban saya: apakah most_common tidak harus melakukan penyortiran juga, sehingga kompleksitasnya adalah O(nlog(n)) untuk kedua solusi? - person timgeb; 10.01.2016
comment
Bagaimana dengan jawaban TigerhawkT3? - person Iron Fist; 10.01.2016
comment
@IronFist Itu juga memiliki kompleksitas O(nlogn) yang sama. - person thefourtheye; 10.01.2016
comment
Untuk memilih hanya 3 elemen most_common harus lebih dekat dengan waktu linier stackoverflow.com/questions/29240807/ - person Akavall; 10.01.2016

Dapatkan kunci dengan tiga nilai terbesar.

>>> import heapq
>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> largest = heapq.nlargest(3, d, key=d.__getitem__)
>>> largest
['c', 'a', 'd']

Kemudian pilih salah satunya secara acak:

>>> import random
>>> random.choice(largest)
'c'
person timgeb    schedule 10.01.2016

Urutkan kamus berdasarkan nilai menurun, dapatkan tiga objek pertama dari hasil list, lalu gunakan random.choice:

>>> import random
>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> random.choice(sorted(d, reverse=True, key=d.get)[:3])
'c'

Dan jangan beri nama dict atau Anda akan menutupi yang ada di dalamnya.

person TigerhawkT3    schedule 10.01.2016