2017-01-28 6 views
0

У меня есть следующий список словарей. Я хотел получить выход, основанный на начале и закрытии. Если два или более дней имеют одинаковые тайминги, их следует объединить и отобразить, как показано на выходе.Как сопоставить элементы словарей для данного Python Список словарей?

timings = [ 
    {'day': 'Monday', 'start': '8:00 am', 'close': '5:00 pm'}, 
    {'day': 'Tuesday', 'start': '7:00 am', 'close': '4:00 pm'}, 
    {'day': 'Wednesday', 'start': '7:00 am', 'close': '4:00 pm'}, 
    {'day': 'Thursday', 'start': '8:00 am', 'close': '5:00 pm'}, 
    {'day': 'Friday', 'start': '9:00 am', 'close': '4:00 pm'}, 
    {'day': 'Saturday', 'start': '9:00 am', 'close': '4:00 pm'}, 
    {'day': 'Sunday', 'start': '8:00 am', 'close': '5:00 pm'} 
] 

Выход:

Monday   - 8:00 am - 5:00 pm 

Tuesday-Wednesday - 7:00 am - 4:00 pm 

Thursday   - 8:00 am - 5:00 pm 

Friday-Saturday - 9:00 am - 4:00 pm 

Sunday   - 8:00 am - 5:00 pm 
+0

Это будет раздражающе трудно, используя струны ... наверное намного проще, если вы используете объекты datetime. –

+0

@AChampion да, конечно, но у вас все еще есть время, как строки. –

+0

@ juanpa.arrivillaga не уверен, что я вижу, что в качестве проблемы для сравнения будет достаточно сравнения строк '' 9:00 am '==' 9:00 am '-> True' – AChampion

ответ

4

Простое решение этой проблемы было бы использовать itertools.groupby, например:

>>> import itertools as it 
>>> for (start, close), days in it.groupby(timings, lambda t: (t['start'], t['close'])): 
... print('{:20} - {} - {}'.format('-'.join(d['day'] for d in days), start, close)) 
Monday    - 8:00 am - 5:00 pm 
Tuesday-Wednesday - 7:00 am - 4:00 pm 
Thursday    - 8:00 am - 5:00 pm 
Friday-Saturday  - 9:00 am - 4:00 pm 
Sunday    - 8:00 am - 5:00 pm 
+0

Очень приятно! - Не понимал, что можно использовать тот факт, что дни правильно упорядочены в «таймингах» и что «groupby» ожидает список, уже отсортированный по ключу. Может быть, было бы полезно добавить (короткое) объяснение последнего факта? –

+0

Большое спасибо. Я попытался использовать сравнение строк и все. закончил с большим кодом. @Jonathan Спасибо за объяснение. –

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