การเลือกค่าสุ่มจากพจนานุกรม

สมมติว่าฉันมีพจนานุกรมนี้:

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

ฉันได้รับรหัสที่มีค่ามากที่สุดด้วยรหัสนี้:

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

มันส่งคืน 'c'

แต่ฉันต้องการเลือกคีย์สุ่มจากค่าที่ยิ่งใหญ่ที่สุด 3 อันดับแรก ตามพจนานุกรมนี้ 3 อันดับแรกคือ:

c
a
d

ควรสุ่มเลือกคีย์จากพวกเขา ฉันจะทำเช่นนั้นได้อย่างไร?


person JayGatsby    schedule 10.01.2016    source แหล่งที่มา
comment
คุณต้องการสุ่มเลือกรายการเดียวจากพจนานุกรมหรือไม่? หรือการเลือกสุ่มเดี่ยวจาก list ที่มีอยู่ก่อนหน้าของคีย์ 3 อันดับแรก? หรือคุณต้องการค้นหาคีย์ 3 อันดับแรกแล้วเลือกคีย์สุ่มเพียงคีย์เดียวจากคีย์เหล่านั้น   -  person TigerhawkT3    schedule 10.01.2016
comment
ฉันเกลียดที่จะเป็นคนขี้น้อยใจ แต่คำถามนี้ตอบได้ง่าย ๆ ด้วยการรวมคำตอบจาก ฉันจะสุ่มเลือกรายการจากรายการโดยใช้ Python ได้อย่างไร ? และ ค่าสูงสุด 5 ค่าในพจนานุกรมหลาม ด้วยเหตุนี้ฉันจึงลงคะแนน เนื่องจากนั่นถือเป็นความพยายามวิจัยที่ไม่ดีในหนังสือของฉัน คุณช่วยอธิบายได้ไหมว่าคำถามนี้แยกความแตกต่างจากการตบทั้งสองเข้าด้วยกันได้อย่างไร   -  person jpmc26    schedule 11.01.2016


คำตอบ (3)


หากคุณต้องการค้นหาคีย์ 3 อันดับแรกแล้วรับคีย์ใดคีย์หนึ่งแบบสุ่ม ฉันขอแนะนำให้ใช้ random.choice และ collections.Counter เช่นนี้

>>> 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) จะได้รับค่าสามอันดับแรกจากพจนานุกรมตามค่าของ วัตถุพจนานุกรมที่ส่งผ่านไป จากนั้นเราจะสุ่มเลือกหนึ่งในค่าที่ส่งคืน และส่งคืนเฉพาะคีย์จากค่านั้น

person thefourtheye    schedule 10.01.2016
comment
เกี่ยวกับความคิดเห็นก่อนหน้าของคุณเกี่ยวกับคำตอบของฉัน: most_common ไม่จำเป็นต้องทำการเรียงลำดับเช่นกัน ความซับซ้อนคือ O(nlog(n)) สำหรับทั้งสองวิธีหรือไม่ - person timgeb; 10.01.2016
comment
แล้วคำตอบของ TigerhawkT3 ล่ะ - person Iron Fist; 10.01.2016
comment
@IronFist นั่นก็มีความซับซ้อน O(nlogn) เหมือนกัน - person thefourtheye; 10.01.2016
comment
สำหรับการเลือกเพียง 3 องค์ประกอบ most_common ควรใกล้กับเวลาเชิงเส้นมากขึ้น stackoverflow.com/questions/29240807/ - person Akavall; 10.01.2016

รับคีย์ที่มีค่ามากที่สุดสามค่า

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

จากนั้นเลือกหนึ่งในนั้นโดยการสุ่ม:

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

จัดเรียงพจนานุกรมตามค่าจากมากไปหาน้อย รับอ็อบเจ็กต์สามรายการแรกจากผลลัพธ์ list จากนั้นใช้ random.choice:

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

และอย่าเรียกมันว่า dict ไม่เช่นนั้นคุณจะปกปิดบิวท์อิน

person TigerhawkT3    schedule 10.01.2016