Разбор списка словарей с несколькими одинаковыми ключами - PullRequest
0 голосов
/ 02 июня 2018

Я начал с этого списка словарей.

[{'allow_day_and_time': {'day': 'Monday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Tuesday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Wednesday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Thursday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Friday', 'start': 9, 'end': 18}}]

Я применил это.

index = 0
    while index < len(availability_constraints):
        for key in availability_constraints[index]:
            print(availability_constraints[index][key])
        index += 1

приводит к

{'day': 'Monday', 'start': 9, 'end': 18}
{'day': 'Tuesday', 'start': 9, 'end': 18}
{'day': 'Wednesday', 'start': 9, 'end': 18}
{'day': 'Thursday', 'start': 9, 'end': 18}
{'day': 'Friday', 'start': 9, 'end': 18}

Возможно, я мог бы бытьвозвратил несколько начальных и конечных значений для любого из дней, возвращаемых, например, начало понедельника 9, конец 11, начало понедельника 13, конец 18.

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

Любые указатели будут большой помощью.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вы можете использовать itertools.groupby, чтобы найти все дни, связанные с общими начальными и конечными значениями:

import itertools
def time_key(x:dict):
  _d = x['allow_day_and_time']
  return _d['start'], _d['end']

d = [{'allow_day_and_time': {'day': 'Monday', 'start': 9, 'end': 18}}, {'allow_day_and_time': {'day': 'Tuesday', 'start': 9, 'end': 18}}, {'allow_day_and_time': {'day': 'Wednesday', 'start': 9, 'end': 18}}, {'allow_day_and_time': {'day': 'Thursday', 'start': 9, 'end': 18}}, {'allow_day_and_time': {'day': 'Friday', 'start': 9, 'end': 18}}, {'allow_day_and_time': {'day': 'Monday', 'start': 13, 'end': 21}}, {'allow_day_and_time': {'day': 'Tuesday', 'start': 13, 'end': 21}}, {'allow_day_and_time': {'day': 'Wednesday', 'start': 13, 'end': 21}}, {'allow_day_and_time': {'day': 'Thursday', 'start': 13, 'end': 21}}, {'allow_day_and_time': {'day': 'Friday', 'start': 13, 'end': 21}}]
new_d = [{'start':_s, 'end':_e, 'days':[i['allow_day_and_time']['day'] for i in b]} for [_s, _e], b in itertools.groupby(sorted(d, key=time_key), key=time_key)]

Вывод:

[{'start': 9, 'end': 18, 'days': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']}, {'start': 13, 'end': 21, 'days': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']}]
0 голосов
/ 02 июня 2018

Я предполагаю, что ваши полные данные могут выглядеть примерно так:

[{'allow_day_and_time': {'day': 'Monday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Tuesday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Wednesday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Thursday', 'start': 9, 'end': 18}}, 
{'allow_day_and_time': {'day': 'Friday', 'start': 9, 'end': 18}},
{'allow_day_and_time': {'day': 'Monday', 'start': 13, 'end': 21}}, 
{'allow_day_and_time': {'day': 'Tuesday', 'start': 13, 'end': 21}}, 
{'allow_day_and_time': {'day': 'Wednesday', 'start': 13, 'end': 21}}, 
{'allow_day_and_time': {'day': 'Thursday', 'start': 13, 'end': 21}}, 
{'allow_day_and_time': {'day': 'Friday', 'start': 13, 'end': 21}}]

Поскольку ваши данные представляют собой list из dictionary элементов, вы можете получить доступ к dictionaryпросто указав key в скобках [], или вы можете получить key и value, используя dictionary.iteritems()

Итерация с dictionary.iteritems()

In [  ]: index = 0
    ...: while index < len(availability_constraints):
    ...:     for key, value in availability_constraints[index].iteritems():
    ...:         print(key, value)
    ...:     index += 1
    ...: 
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Monday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Tuesday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Wednesday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Thursday'})
('allow_day_and_time', {'start': 9, 'end': 18, 'day': 'Friday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Monday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Tuesday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Wednesday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Thursday'})
('allow_day_and_time', {'start': 13, 'end': 21, 'day': 'Friday'})

Допустим, вы запрашиваете начало Monday, вы можете использовать операторы if и ==, чтобы проверить, ссылается ли value этого конкретного элемента списка на Monday:

In [  ]: index = 0
    ...: while index < len(availability_constraints):
    ...:     for key, value in availability_constraints[index].iteritems():
    ...:         if value['day'] == 'Monday':
    ...:             print("Start: {:>4}, Finish: {:>4}".format(value['start'], value['end']))
    ...:     index += 1
    ...: 
Start:    9, Finish:   18
Start:   13, Finish:   21

Итерации с [] и подача в жестком коде key

Еще один более простой / жестко закодированный, который может быть не лучшим способом программирования, показан ниже:

In [  ]: for a_day in availability_constraints:
    ...:     if a_day['allow_day_and_time']['day'] == 'Monday':
    ...:         print("Start: {:>4}, Finish: {:>4}".format(
    ...:          a_day['allow_day_and_time']['start'],
    ...:          a_day['allow_day_and_time']['end']))
    ...:         
    ...:         
Start:    9, Finish:   18
Start:   13, Finish:   21

Мы также можем ввести косвенное обращение для лучшего обслуживания:

In [  ]: key = 'allow_day_and_time'
    ...: target_day = 'Monday'
    ...: begin = 'start'
    ...: finish = 'end'
    ...: for a_day in availability_constraints:
    ...:     if a_day[key]['day'] == target_day:
    ...:         print("Start: {:>4}, Finish: {:>4}".format(
    ...:          a_day[key][begin],
    ...:          a_day[key][finish]))
    ...:         
    ...:         
Start:    9, Finish:   18
Start:   13, Finish:   21

Вывод: Pythonic way

Проверьте эту ссылку для pythonic string formatting

In [  ]: for a_day in availability_constraints:
    ...:     for key, value in a_day.iteritems():
    ...:         if value['day'] == 'Monday':
    ...:             print("Start: {:>4}, Finish: {:>4}".format(value['start'], value['end']))
Start:    9, Finish:   18
Start:   13, Finish:   21

Какой стиль программирования лучший?Ну, я сам достаточно самоуверенный, поэтому я полагаю, что это зависит от ваших предпочтений, если вы не хотите оптимизировать эту программу: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...