2015-05-07 5 views
3

Python 2.7Python: Найти наименьшее значения в гнездовой Словаре

Это вариация на Python: get key with the least value from a dictionary BUT multiple minimum values

У меня есть словарь, который выглядит следующим образом:

dates = { 
    'first record': { 
     'first date': '1985', 
     'last date': '2000', 
     }, 
    'second record': { 
     'first date': '1985', 
     'last date': '2012', 
     }, 
    'third record': { 
     'first date': '1985', 
     'last date': '2000', 
     }, 
    'fourth record': { 
     'first date': '2000', 
     'last date': '2014', 
     } 
} 

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

Мне сложно определить, как реализовать решение, используя подход itervalues ​​/ iteritems, описанный в ответах на подобные (но менее сложные) вопросы. Может ли кто-нибудь предложить какие-то рекомендации?

+0

Это могло бы быть более полезным реализовать класс и переопределить сравнительные методы магии, а затем отсортировать их. –

ответ

0

Как вы просто хотите ключи:

mn_year = min((int(d['first date']), int(d['last date'])) for d in dates.values()) 

print(mn_year) 

print([k for k in dates 
     if (int(dates[k]['first date']), int(dates[k]['last date'])) == mn_year]) 
(1985, 2000) 
['third record', 'first record'] 

Если значения не связаны вам нужно вычислить мин отдельно т.е.:

dates = { 
    'first record': { 
     'first date': '1984', 
     'last date': '2001', 
    }, 
    'second record': { 
     'first date': '1985', 
     'last date': '2012', 
    }, 
    'third record': { 
     'first date': '1985', 
     'last date': '2000', 
    }, 
    'fourth record': { 
     'first date': '2000', 
     'last date': '2014', 
    } 
} 


mn_first = min((int(d['first date'])) for d in dates.values()) 
mn_last = min((int(d['last date'])) for d in dates.values()) 


print([k for k,v in dates.iteritems() 
     if int(v['first date']) == mn_first or int(v['last date']) == mn_last]) 

возвращает ['third record', 'first record'] в отличие от ['first record'] с использованием первого кода ,

Получение мин кортежей не получит мин каждой клавиши, но МИН парного до кортежа так что любой уникальный first date не обязательно получить сопряженный с минимальным last date, если минимальное last date не происходит в том же Словаре.

Вместо зацикливания дважды, чтобы получить мин мы можем получить и в то же самое с помощью цикла:

mn_first, mn_last = float("inf"),float("inf") 

for d in dates.values(): 
    f, l = int(d['first date']),int(d['last date']) 
    if f < mn_first: 
     mn_first = f 
    if l < mn_last: 
     mn_last = l 



print([k for k,v in dates.iteritems() 
     if int(v['first date']) == mn_first or int(v['last date']) == mn_last]) 
+0

Этот последний бит с пониманием в списке должен быть и, а не, или, но это работает отлично. Большое спасибо. – AutomaticStatic

+0

@AutomaticStatic, хорошо, так что вам нужны ключи, которые удовлетворяют обоим условиям? –

+0

Да. Изменение или, похоже, работает нормально. – AutomaticStatic

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