#python
Вопрос:
Я пытаюсь объединить список значений в определенные интервалы.
У меня есть строка ниже, которая представляет units: timestamp
2:0,1: 9,5:10,2:12,4:19,5:35
что подразумевает приведенную ниже информацию:
units: 2, timestamp: 0 units: 1, timestamp: 9 units: 5, timestamp: 10 units: 2, timestamp: 12 units: 4, timestamp: 19 units: 5, timestamp: 35
Я пытаюсь рассчитать максимальное значение в интервалах 10
Вот мое решение до сих пор:
units_to_parse = '2:0,1:9,5:10,2:12,4:19,5:35' def parse_units(units_to_parse): units_to_parse = units_to_parse.split(',') units = [] cur_timestamp = 0 for pair in units_to_parse: unit = pair.split(':')[0] timestamp = int(pair.split(':')[1]) if timestamp lt; cur_timestamp 10: units.append(unit) elif timestamp gt;= cur_timestamp 10: print(f"{cur_timestamp}, {max(units)}") units = [unit] cur_timestamp = cur_timestamp 10 if __name__ == '__main__': parse_units( units_to_parse)
Я пытаюсь заполнить недостающие слоты максимальным значением предыдущего слота. Что-то вроде этого:
{timeslot: maxvalue} {0: 2} {10: 5} {20: 5} {30: 5}
есть ли хороший способ заполнить недостающую информацию о слоте здесь?
Ответ №1:
Здесь вам нужно найти max timestamp
и min timestamp
. И сформируйте словарь ключевых значений на основе этой метки времени.
Обратите внимание, что ключ всегда является меткой времени, так как он должен быть уникальным в словаре
units_to_parse = '2:0,1:9,5:10,2:12,4:19,5:35,7:38,0:40,6:55,9:75' def parse_units(units_to_parse): units_to_parse = units_to_parse.split(',') max_timestamp = max([int(a.split(':')[1]) for a in units_to_parse]) max_timestamp = max_timestamp - (max_timestamp) min_timestamp = min([int(a.split(':')[1]) for a in units_to_parse]) min_timestamp = min_timestamp - (min_timestamp) time_val = {int(a.split(':')[1]):int(a.split(':')[0]) for a in units_to_parse} #form a dictionary where key should be timestamp temp_val = {} for t in range(min_timestamp, max_timestamp 1, 10): try: t_range = list(range(t, t 10)) v_range = [v for k,v in time_val.items() if k in t_range] print(t, max(v_range)) temp_val[t] = max(v_range) except: #if key is not found print(t, list(temp_val.values())[-1]) temp_val[t] = list(temp_val.values())[-1] if __name__ == '__main__': parse_units(units_to_parse)
Комментарии:
1. спасибо за предложение, приведенное выше решение не дает максимального значения для конкретного слота. Например, если у нас есть вход, как
''2:0,1:9,5:10,2:12,4:19,5:35, 7:38"
мы получаем вывод : 0 2 10 5 20 5 30 5, но предполагаемый вывод : 0 2 10 5 20 5 30 72. здесь слот
30
имеет метки времени (35, 38) и их значения (5, 7), поэтому максимальное значение слота(30) будет7
3. итак, слот 30 колеблется от 30-40 до 20-30? Я не совсем ясно понял ваш вопрос
4. извините, я мог бы сформулировать свой вопрос более ясно. Слот 30 будет иметь значения временных меток [30-40) 30, включенные до 39, но не 40
5. @CodingBabai только что обновил ответ, проверьте его