Size: a a a

2020 October 01

E

Eugene in PiterPy Meetup
Боброний
У кого-нибудь здесь сломался дебаггер в пайчарме?
источник

AZ

Andrey Zakharevich in PiterPy Meetup
Anatoly
Всем привет!
Кто-нибудь сталкивался с задачей получения свободного рабочего  времени?
Скажем, задано рабочее время:
times_data = [
   {'start': '08:00', 'end': '12:00'},
   {'start': '13:00', 'end': '17:00'},
]

Из него надо вычесть интервалы отсутствий:
times_off_data = [
   {'start': '08:00', 'end': '09:00'},
   {'start': '11:00', 'end': '16:00'},
]

Чтобы в итоге получилось:
times = [
   {'start': '09:00', 'end': '10:00'},
   {'start': '16:00', 'end': '17:00'}
]

Мб кто-нибудь знает удобные способы для решения такой задачи?
расскажи, где у тебя такая задача возникла?
источник

Б

Боброний in PiterPy Meetup
Eugene
у меня сломался на multiprocessing на удаленном интерпретаторе. Я заводил тикет. Там у них дофига тикетов на отладчик
Кажется, это связанно, потому что в одном потоке/в простых скриптах вроде как дебаггер работает
источник

Б

Боброний in PiterPy Meetup
Как жить-то теперь 🌚
источник

АП

Алексей А́риксу Петр... in PiterPy Meetup
Andrey Zakharevich
да зачем вообще. руками фигануть в один список время-ивент, отсортировать и пройтись один раз по нему. вообще выглядит как задачка с собеседования
О, так действительно проще.
источник

A

Anatoly in PiterPy Meetup
Andrey Zakharevich
расскажи, где у тебя такая задача возникла?
Да вот в реальной жизни оказалось нужно, не на собесе. Кажется, получилось, но весьма страшно.
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: x[1]))

results = []
saved = dict()
f = 0
for t in data:
   if t[0] in ['start', 'off_end']:
       saved['start'] = t[1]
       f = 0
   elif t[0] in ['end']:
       saved['end'] = t[1]
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start'] and not f:
           results.append(dict(saved))
   else:
       saved['end'] = t[1]
       f = 1
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start']:
           results.append(dict(saved))
print(results)

Получается, что надо отслеживать, когда началось отсутствие (для этого флаг f) и проверять, что end > start, чтобы не сохранять отрезки вида {'start': '08:00', 'end': '08:00'}.
источник

p

pragus in PiterPy Meetup
Anatoly
Да вот в реальной жизни оказалось нужно, не на собесе. Кажется, получилось, но весьма страшно.
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: x[1]))

results = []
saved = dict()
f = 0
for t in data:
   if t[0] in ['start', 'off_end']:
       saved['start'] = t[1]
       f = 0
   elif t[0] in ['end']:
       saved['end'] = t[1]
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start'] and not f:
           results.append(dict(saved))
   else:
       saved['end'] = t[1]
       f = 1
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start']:
           results.append(dict(saved))
print(results)

Получается, что надо отслеживать, когда началось отсутствие (для этого флаг f) и проверять, что end > start, чтобы не сохранять отрезки вида {'start': '08:00', 'end': '08:00'}.
Что будет при переходе на летнее/зимнее время?
источник

AZ

Andrey Zakharevich in PiterPy Meetup
pragus
Что будет при переходе на летнее/зимнее время?
ну что ты сразу валишь
источник

AZ

Andrey Zakharevich in PiterPy Meetup
Anatoly
Да вот в реальной жизни оказалось нужно, не на собесе. Кажется, получилось, но весьма страшно.
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: x[1]))

results = []
saved = dict()
f = 0
for t in data:
   if t[0] in ['start', 'off_end']:
       saved['start'] = t[1]
       f = 0
   elif t[0] in ['end']:
       saved['end'] = t[1]
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start'] and not f:
           results.append(dict(saved))
   else:
       saved['end'] = t[1]
       f = 1
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start']:
           results.append(dict(saved))
print(results)

Получается, что надо отслеживать, когда началось отсутствие (для этого флаг f) и проверять, что end > start, чтобы не сохранять отрезки вида {'start': '08:00', 'end': '08:00'}.
вообще я что-то совсем не уверен, что тебе надо все это счастье в saved сохранять. проверь еще, что все правильно сработает, если есть один большой отрезок и в нем несколько маленьких противоположных
источник

AZ

Andrey Zakharevich in PiterPy Meetup
Anatoly
Да вот в реальной жизни оказалось нужно, не на собесе. Кажется, получилось, но весьма страшно.
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: x[1]))

results = []
saved = dict()
f = 0
for t in data:
   if t[0] in ['start', 'off_end']:
       saved['start'] = t[1]
       f = 0
   elif t[0] in ['end']:
       saved['end'] = t[1]
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start'] and not f:
           results.append(dict(saved))
   else:
       saved['end'] = t[1]
       f = 1
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start']:
           results.append(dict(saved))
print(results)

Получается, что надо отслеживать, когда началось отсутствие (для этого флаг f) и проверять, что end > start, чтобы не сохранять отрезки вида {'start': '08:00', 'end': '08:00'}.
попробуй сделать так, чтобы после прохода у тебя получился список событий начало/конец. а по парам уже потом их разобьешь
источник

p

pragus in PiterPy Meetup
Anatoly
Да вот в реальной жизни оказалось нужно, не на собесе. Кажется, получилось, но весьма страшно.
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: x[1]))

results = []
saved = dict()
f = 0
for t in data:
   if t[0] in ['start', 'off_end']:
       saved['start'] = t[1]
       f = 0
   elif t[0] in ['end']:
       saved['end'] = t[1]
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start'] and not f:
           results.append(dict(saved))
   else:
       saved['end'] = t[1]
       f = 1
       if all([saved.get('end'), saved.get('start')]) and saved.get('end') > saved['start']:
           results.append(dict(saved))
print(results)

Получается, что надо отслеживать, когда началось отсутствие (для этого флаг f) и проверять, что end > start, чтобы не сохранять отрезки вида {'start': '08:00', 'end': '08:00'}.
Я бы использовал start + duration
источник

BK

Boris Kirikov in PiterPy Meetup
Привет всем!

Я решил, что могу в свободное время помогать кому нибудь в изучении программирования в целом и/или питона в частности. Для начала за бесплатно или за пиво.

Знает ли кто, кому это могло бы быть интересно? Или, может, куда лучше стоит про это написать (какие-то группы, каналы, сервисы)?
источник

G

Guest007 in PiterPy Meetup
Boris Kirikov
Привет всем!

Я решил, что могу в свободное время помогать кому нибудь в изучении программирования в целом и/или питона в частности. Для начала за бесплатно или за пиво.

Знает ли кто, кому это могло бы быть интересно? Или, может, куда лучше стоит про это написать (какие-то группы, каналы, сервисы)?
источник

BK

Boris Kirikov in PiterPy Meetup
Спасибо!
источник
2020 October 02

A

Anatoly in PiterPy Meetup
Andrey Zakharevich
попробуй сделать так, чтобы после прохода у тебя получился список событий начало/конец. а по парам уже потом их разобьешь
хм,  со saved удобно делать проверки, чтобы не добавлять лишнее в results. А как можно без предварительного сохранения start и end сделать, пока не могу сообразить.
И кстати, норм работает при большом интервале с маленькими противоположными.
источник

A

Anatoly in PiterPy Meetup
Anatoly
хм,  со saved удобно делать проверки, чтобы не добавлять лишнее в results. А как можно без предварительного сохранения start и end сделать, пока не могу сообразить.
И кстати, норм работает при большом интервале с маленькими противоположными.
Решение попроще:
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: (x[1])))

results = []

for i in range(len(data) - 1):
   start = data[i]
   end = data[i + 1]
   start_time = start[1]
   end_time = end[1]

   is_start = start[0] in ['start', 'off_end']
   is_end = end[0] in ['off_start', 'end']

   if all([is_end, is_start, (end_time > start_time)]):
       results.append({'start': start_time, 'end': end_time})

print(results)
Еще было бы круче, если бы можно было отсортировать так, чтобы было чередование start и end. Тогда просто в цикле проверять, что end > start.
источник

p

pragus in PiterPy Meetup
Anatoly
Решение попроще:
times_off_data = [
   ('off_start', '07:00'), ('off_end', '09:00'),
   ('off_start', '10:00'), ('off_end', '16:00'),
]

times_data = [
   ('start', '08:00'), ('end', '12:00'),
   ('start', '13:00'), ('end', '17:00'),
]

data_ = times_data + times_off_data
data = list(sorted(data_, key=lambda x: (x[1])))

results = []

for i in range(len(data) - 1):
   start = data[i]
   end = data[i + 1]
   start_time = start[1]
   end_time = end[1]

   is_start = start[0] in ['start', 'off_end']
   is_end = end[0] in ['off_start', 'end']

   if all([is_end, is_start, (end_time > start_time)]):
       results.append({'start': start_time, 'end': end_time})

print(results)
Еще было бы круче, если бы можно было отсортировать так, чтобы было чередование start и end. Тогда просто в цикле проверять, что end > start.
> data = list(sorted(data_, key=lambda x: (x[1])))

а почему это корректно?
источник

A

Anatoly in PiterPy Meetup
pragus
> data = list(sorted(data_, key=lambda x: (x[1])))

а почему это корректно?
то, что sorted в list завернут? Ну да, это лишнее)
источник

p

pragus in PiterPy Meetup
Anatoly
то, что sorted в list завернут? Ну да, это лишнее)
нет, почему вы считаете что в таком случае будет правильная сортировка? или исходите из 24 часового формата времени?
источник

A

Anatoly in PiterPy Meetup
pragus
нет, почему вы считаете что в таком случае будет правильная сортировка? или исходите из 24 часового формата времени?
ну да,  от 00:00 до 23:59
источник