Поэлементное манипулирование двумерным списком в python - PullRequest
0 голосов
/ 04 февраля 2020

Я пишу сценарий, чтобы найти время встречи для трех человек. Мне удается получить их кодировку статуса Свободен / Занят в двоичном формате, где 0 свободно и 1 занято с шагом 30 минут в течение следующих трех дней. Я сгруппировал их статус по дням в словарный формат, как показано ниже.

print(date_schedule)
{'Monday, 2020-02-03': ['000000000000000000101101001110110000000000000000',
  '000000000000000000001111011100001100000000000000',
  '000000000000000011110100011000110000000000000000'],
 'Tuesday, 2020-02-04': ['000000000000000000100010000000000000000000000000',
  '000000000000000000001111001000110000000000000000',
  '000000000000000011111000111100101000000000000000'],
 'Wednesday, 2020-02-05': ['000000000000000000111000000000000000000000000000',
  '000000000000000001001100110000000000000000000000',
  '000000000000000000111100000001001000000000000000']}

Цель: Перевести эти 0 в блок из тридцати минутных интервалов.

For Example: 00:00----00:30
             00:30----01:00
                   ...
             23:30----24:00

Попытка:

#Separate the code into a two dimensional list
schedule = date_free.values()

#Append the block to a new list.
free = []
for value in schedule:
   for v in value:
       for idx, time in enumerate(v):
           if time == '0':
                idx = idx/2
                end = idx + 0.5
                #5 slots, and two decimals
                idx = '{:05.2f}'.format(idx).replace('.50','.30').replace('.',':')
                end =  '{:05.2f}'.format(end).replace('.50','.30').replace('.',':')
                free.append((idx + '----' + end))

Проблема: free имеет 372 элемента, и я не знаю, как сделать так, чтобы он стал структура двумерного списка, как это было раньше в schedule (потому что число 0 отличается для каждого v). Есть ли способ не создавать новый список, а напрямую применить вышеуказанную логику c поэлементно к расписанию ?

Бонусный вопрос : я не получил пока нет, но моя следующая цель - найти пересечение этих 30 временных блоков для каждого дня, как показано в примере random ниже. Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать

print(date_time_final)
{'Monday, 2020-02-03': ['08:00----08:30','09:30----10:00','12:00----12:30'],
'Tuesday, 2020-02-04' : ['09:00----09:30','10:30----11:00','13:00----13:30','14:00----14:30']
'Wednesday, 2020-02-05' : ['07:00----07:30','14:30----15:00','15:00----15:30','19:00----19:30']}

Заранее благодарю за помощь!

1 Ответ

1 голос
/ 05 февраля 2020

Это что-то вроде того, что вы искали?

schedule = {'Monday, 2020-02-03': ['000000000000000000101101001110110000000000000000',
  '000000000000000000001111011100001100000000000000',
  '000000000000000011110100011000110000000000000000'],
 'Tuesday, 2020-02-04': ['000000000000000000100010000000000000000000000000',
  '000000000000000000001111001000110000000000000000',
  '000000000000000011111000111100101000000000000000'],
 'Wednesday, 2020-02-05': ['000000000000000000111000000000000000000000000000',
  '000000000000000001001100110000000000000000000000',
  '000000000000000000111100000001001000000000000000']}

combined = {}
for value in schedule:
    day = {}
    for v in schedule[value]:
        for idx, time in enumerate(v):
            idx = idx/2
            end = idx + 0.5
            #5 slots, and two decimals
            idx = '{:05.2f}'.format(idx).replace('.50','.30').replace('.',':')
            end =  '{:05.2f}'.format(end).replace('.50','.30').replace('.',':')

            if time == '0':
                try: #Only assigns "True" if value does not yet exist and is not already False
                    if day[idx + '----' + end] == False:
                        pass
                    else:
                        day[idx + '----' + end] = True
                except:
                    day[idx + '----' + end] = True
            elif time == '1':
                day[idx + '----' + end] = False
    combined[value] = day

for day in combined:
    print(day)
    for time_slot in combined[day]:
        print("Time slot %s is free = %s" % (time_slot, str(combined[day][time_slot])))

Вместо списков я использовал формат словаря для сортировки по дням и по временным интервалам, сохраняя каждый временной интервал в записи, но давая им логическое значение, чтобы определить, свободно это или нет. (True == свободно, False == занято) Таким образом, вы можете делать с выводом все что угодно.

...