Как разорвать связь случайным образом из самых высоких значений словаря в Python? - PullRequest
1 голос
/ 08 ноября 2019

Я хочу вернуть ключ, который имеет наибольшее значение в словаре, и, если есть связь, выбрать один из них случайным образом. Я знаю, как получить максимальное значение, но не могу понять, как разорвать связь.

max(result, key = result.get) 

Это дает мне максимальное значение, но если в словаре есть связь, то оно просто дает мне первое, с чем встречается

Учитывая словарь {'banana': 3, 'apple': 2, 'cherry': 1, 'orange': 3}

Выходные данные должны давать либо banana, либо orange, но в случайном порядке.

Ответы [ 4 ]

4 голосов
/ 08 ноября 2019

Сначала получите значение max из dict

import random
maxValue = max(result.values())

, а затем соберите все ключи в list, которые имеют максимальное значение, используя Список пониманий

keys = [key for key, value in result.items() if value == maxValue]

Теперь получите случайное значение из keys

choice = random.choice(keys)
0 голосов
/ 08 ноября 2019

Вы можете использовать функции list comprehension, max и random:

import random
data = {'banana': 3, 'apple': 2, 'cherry': 1, 'orange': 3}
result = [i for i, v in data.items() if v == max(data.values())]
print (random.choice(result))

# With simple for loop and if condition
result_1 = []
for i, v in data.items():
    if v == max(data.values()):
        result_1.append(i)
print (random.choice(result_1))

Надеюсь, это поможет и будет иметь значение!

0 голосов
/ 08 ноября 2019

Вы можете использовать groupby + choice:

from itertools import groupby
import random

d = {'banana': 3, 'apple': 12, 'cherry': 1, 'orange': 12}

print(random.choice(max(((k, list(g)) for k, g in groupby(sorted(d, key=d.get), key=d.get)), key=lambda x: x[0])[1]))
0 голосов
/ 08 ноября 2019

Вы можете построить обратный словарь:

import random

d =  {'banana': 3, 'apple': 2, 'cherry': 1, 'orange': 3}

d_inv = dict.fromkeys(d.values())
for dkey, dval in d.items(): 
    d_inv.setdefault(dval, list())
    d_inv[dval].append(dkey)

m = max(d.values())
print(random.choice(d_inv[m]))
...