Один простой вариант - сначала определить минимальное значение, а затем выбрать все ключи, соответствующие этому минимуму:
min_value = min(d.itervalues())
min_keys = [k for k in d if d[k] == min_value]
Для Python 3 используйте d.values()
вместо d.itervalues()
.
Для этого требуется два прохода по словарю, но в любом случае это должен быть один из самых быстрых способов сделать это.
Используя отбор проб резервуара , вы можете реализовать подход с одним проходом, который выбирает один из следующих вариантов:случайные элементы:
it = d.iteritems()
min_key, min_value = next(it)
num_mins = 1
for k, v in it:
if v < min_value:
num_mins = 1
min_key, min_value = k, v
elif v == min_value:
num_mins += 1
if random.randrange(num_mins) == 0:
min_key = k
После записи этого кода, я думаю, этот вариант представляет довольно теоретический интерес ...:)