2016-02-09 4 views
1

У меня есть вопрос относительно этого кода: Количество элементов в Словаре меняться при каждой итерации:Python словарь мин макс

d["one"] = 12 
d["two"] = 13 
d["three"] = 14 

maxkey, maxvalue = max(d.iteritems(), key=lambda x:x[1]) 
minkey, minvalue = min(d.iteritems(), key=lambda x:x[1]) 

, если значения «один», «twor» и т.д. различны, все это нормально.

Теперь предположим следующее:

d["one"] = 13 
d["two"] = 13 


maxkey, maxvalue = max(d.iteritems(), key=lambda x:x[1]) 
minkey, minvalue = min(d.iteritems(), key=lambda x:x[1]) 

Я хочу, чтобы следующий результат: Если значения равны, то minkey, MinValue должен быть не такой же, как maxkey, MAXVALUE (она должна быть другой вход/или один из других, если имеется несколько равных записей). Есть ли простой способ реализовать это в Python? Большое спасибо за вашу помощь

Пример:

d["one"] = 12 
d["two"] = 12 
d["three"] = 12 
minkey, minvalue = min(d.iteritems(), key=lambda x:x[1]) 
maxkey, maxvalue = max(d.iteritems(), key=lambda x:x[1]) 

Результат

minkey = "three" 
maxkey = "three" 

, но я хочу, если

minkey = "three" 

затем maxkey должен быть

maxkey = "one" 

или

maxkey = "two" 
+0

Не могли бы вы привести пример для выделенного/желаемого вывода? – albert

ответ

3

Вы можете взять ключ во внимание при поиске мин & макс (с более низким приоритетом):

maxkey, maxvalue = max(d.iteritems(), key=lambda x: (x[1], x[0])) 
minkey, minvalue = min(d.iteritems(), key=lambda x: (x[1], x[0])) 

Поэтому, когда нахождение экстремумов Я не сравниваю Dict значения только, но (value, key) кортежей. Кортежи сначала сравниваются с первым элементом, то есть с заданными кортежами T1 и T2, сначала T1[0] по сравнению с T2[0]. Если T1[0]==T2[0], то сравниваются другие элементы: T1[1] и T2[1]. Таким образом, в моем случае сравниваются ключи dict, если значения равны, то есть ключи сравниваются с более низким приоритетом

+0

Отлично, спасибо, это работает! Не могли бы вы объяснить, что это значит, что это означает «с более низким приоритетом»? – Kenni

+0

Я добавил дополнительную информацию – Lol4t0

2

Вы можете изменить строку с минут до

minkey, minvalue = min(d.iteritems(), key=lambda x: x[1] if x[0] != maxkey else float('inf')) 

Я изменил лямбда-выражение так, что она возвращает бесконечность, если ключ такой же, как maxkey (так он никогда не будет быть минимальным значением). Однако это не сработает, если в словаре есть только 1 пара элементов, но это можно легко зафиксировать с помощью if.

+0

Большое спасибо за ваш ответ. Но мне бы хотелось, чтобы он возвращал одну из других записей - как в примере выше. Это возможно? – Kenni

+1

Он вернет одну из других записей. Однако проверьте ответ Lol4t0. Это немного более элегантно (хотя и немного менее эффективно) – Dunno

Смежные вопросы