2017-02-22 5 views
0

Мне нужно найти месяц, в котором больше всего людей в любой день. Код, который я написал только выглядит по большему количеству дней вместо того, сколько людей дня рождения в этот деньВложенный словарь Python

def total_days(birthdays): 
    ''' 
    >>> total_days({"Jan": {2: ["Ben"], 3: ["Sarah"], 6: ["Rob"]}, 
    "Feb": {1: ["Jimmy", "Timmmy"], 30: ["Sam", "Tony"]}}) 

    'Feb' 

    ''' 
    total = 0 
    month = '' 
    for i in birthdays: 
     new = len(birthdays[i]) 
     if new > total: 
      total = new 
      month = i 
    return month 

Этот код возвращается Jan, потому что в январе 3 даты, а февраль имеет 2, но мне нужен месяц с наибольшим количеством людей, которые должны быть февралем

Благодаря

+0

Одно простое решение было бы использовать вложенную 'for' цикл. – spicypumpkin

+0

Я понял, но я не уверен, как заставить его работать должным образом – Patrick

ответ

1

Вам просто нужно пройти один цикл for глубже. Ваш код является совершенным, за исключением сразу же после того, как ваш первый цикл, добавьте:

for j in birthdays[i]: 
    {rest of your code here} 
+0

спасибо, что это сработало – Patrick

+0

Если да, то, пожалуйста, примите мой ответ как правильный! –

0

Этот код будет сохранять результат в busiest_month.

busiest_month = None 
busiest_day_overall = None, 0 
for month in birthdays: 
    busiest_day_in_month = max([(day, len(people)) for day, people in birthdays[month].items()]) 
    if busiest_day_in_month[1] > busiest_day_overall[1]: 
     busiest_month = month 
0

Один лайнера:

from collections import Counter 
birthdays = {"Jan": {2: ["Ben"], 3: ["Sarah"], 6: ["Rob"]}, 
      "Feb": {1: ["Jimmy", "Timmmy"], 30: ["Sam", "Tony"]}} 

Counter({month: sum(len(names) for names in dates.values()) for (month, dates) in birthdays.items()}).most_common(1)[0][0] 

(Ну, хорошо, технически есть несколько строк там)

Он использует словарь и списочные (словарь постижения означает это только работу в Python 2.7+). По сути, он сглаживает список дат и имен до одного значения - количество имен, прикрепленных к дате, а затем суммирует их в месяц. collections.Counter затем используется, чтобы найти наивысший результат.

0

Try с этим

def total_days(birthdays): 
    total = 0 
    month = '' 
    for i,j in birthdays.viewitems(): 
     new =j.keys() 
     new.sort() 
     if total < new[-1]: 
      total = new[-1] 
      month = i 
    return month 

надеюсь, что это помогает

0

Попробуйте

birthdays={"Jan": {2: ["Ben"], 3: ["Sarah"], 6: ["Rob"]}, 
      "Feb": {1: ["Jimmy", "Timmmy"], 30: ["Sam", "Tony"]}} 
yourData=[(mon,max([len(p) for d,p in day.iteritems()])) for mon,day in birthdays.iteritems()] 
print [i[0] for i in yourData if i[1]==max(map(lambda x: x[1], yourData))][0] 
Смежные вопросы