Форум сайта python.su
Добрый день, пытаюсь постичь язык Python, только начал изучать, есть задача:
дан список raw он наполнен списками, надо убрать из основного списка все списки у которых первое значение <10 и > 12 (либо убрать из основного, либо путем создания нового).
Пример данных в основном списке:
.10, datetime.datetime(2066, 8, 17, 3, 0), 2012651
.[3, datetime.datetime(2066, 8, 17, 22, 43, 11), 22369621
.[1, datetime.datetime(2066, 8, 17, 22, 42, 45), 16973824
.[30, datetime.datetime(2066, 8, 17, 22, 0), 2017897
.[12, datetime.datetime(2066, 8, 17, 3, 0), 686676
.[15, datetime.datetime(2066, 8, 17, 3, 0), 173055
.[16, datetime.datetime(2066, 8, 17, 3, 0), 115532
.[11, datetime.datetime(2066, 8, 17, 3, 0), 1325975
.[19, datetime.datetime(2066, 8, 17, 3, 0), 0
.[30, datetime.datetime(2066, 8, 17, 21, 0), 2017556
И второй вопрос, если я обращаюсь в основном списке ко 2 элементу, то получаю:
2066-08-17 03:00:00
2066-08-17 22:43:11
2066-08-17 22:42:45
2066-08-17 22:00:00
2066-08-17 03:00:00
2066-08-17 03:00:00
2066-08-17 03:00:00
2066-08-17 03:00:00
2066-08-17 03:00:00
2066-08-17 21:00:00
а при обращении к общему списку с datetime, почему так, объясните пожалуйста
Офлайн
Используй тег code для точной передачи кода
[code python]
здесь пиши код
[/code]
Офлайн
На данный момент имею это
import json import datetime file = open('json.txt') #Открытие файла из тойже директории temp = file.read() # Присвоение в data данных из файла data=json.loads(temp) #Создание списка json из данных data (res_dict[2] - доступ ко всему сообщению, где 2 это номер сообщения) file.close #закрытие файла a = 0 for key in data: #цикл перебирает ключи в библиотеке if a <= 15: d_raw = { #создаю словарь с нужными сырыми значениями 'value' : data[a][ 'decodedPayload'], 'rssi' : data[a]['RSSI'], 'stationId' : data[a]['stationId'], 'timeDetected' : data[a]['timeDetected'] } ras = d_raw['value'] # ras - сообщение для расшифровки soob = int(ras[0]+ras[1]) # soob - номер сообщения s_date_raw = int(ras[2]+ras[3]+ras[4]+ras[5]+ras[6]+ras[7]+ras[8]+ras[9], 16) #s_date - дата в 16 системе, с переводом в timestamp s_value_raw = ras[10]+ras[11]+ras[12]+ras[13]+ras[14]+ras[15]+ras[16]+ras[17] #s_value_raw - энергия в 16 системе s_value = int(s_value_raw, 16) # s_value - перевод в 10 s_date = datetime.datetime.fromtimestamp(s_date_raw) # перевод timestamp в дату #print (type(s_date)) d_decod =[soob, s_date, s_value] #print (dict_decod.keys()) #d_decod1 = d_decod.copy() #d_decod = {key:val for key, val in d_decod.keys() if val < 10} print (d_decod) #while d_decod: #if d_decod[0] <10 and d_decod[0] > 12: #decod = [d_decod] #print (decod) else: break a+=1
Прикреплённый файлы:
json.txt (3,7 KБ)
Офлайн
SON.artovУ тебя это условие неправильное. Число не может быть одновременно меньше десяти и больше двенадцати.if d_decod[0] <10 and d_decod[0] > 12:
if 10 <= d_decod[0] <= 12:
Отредактировано py.user.next (Июль 1, 2022 00:58:05)
Офлайн
py.user.nextУвы получается так:
Прикреплённый файлы:
2022-06-30_20-20-44.png (23,4 KБ)
Офлайн
Я так понимаю что порядок действий должен быть такой:
1. Основной список перебираю (Как вложеные списки “нумеруются”?)
2. Вложенный список по первому значению сравниваю с условием
3. Редактирую/создаю список с отфильтрованными данными.
Беда в том, что не знаю как уже сформулировать вопрос что бы продолжить движение по этому ряду вопросов (( Какие сообщения удалять или переносить привязаны именно к первому значению в списке, интересуют только 10, 11, 12
Отредактировано SON.artov (Июнь 30, 2022 20:27:44)
Офлайн
import datetime import json # def get_payload_lst(data: dict) -> list: return [d['decodedPayload'] for d in data] # def decode_payload(pd: str) -> tuple: soob = int(pd[:2]) # soob - номер сообщения s_date_raw = int(pd[2:9],16) # s_date - дата в 16 системе, с переводом в timestamp s_value = int(pd[10:17], 16) # s_value - перевод в 10 s_date = datetime.datetime.fromtimestamp(s_date_raw) return soob, s_date, s_value # if __name__ == '__main__': with open('json.txt', 'r') as f: data = json.load(f) print(data) print('\n=============================\n') # pld_lst = get_payload_lst(data) print(pld_lst) print('\n================================\n') # decode_pld_lst = [decode_payload(pd) for pd in pld_lst] print(decode_pld_lst) print('\n================================\n') res = [data for data in decode_pld_lst if 10 <= data[0] <= 12] print(res) print('\n================================\n')
Офлайн
xam1816Не с 2 по 9, а с 2 по 10 должно быть. То же самое для с 10 по 17, должно быть с 10 по 18.s_date_raw = int(pd[2:9],16) s_value = int(pd[10:17], 16)
SON.artovЯ там неправильно написал вначале, сейчас исправил. Попробуй в свой первоначальный код вставь условие.
Увы получается так:
Отредактировано py.user.next (Июль 1, 2022 01:28:39)
Офлайн
Большое спасибо за советы и помощь, буду разбираться ! ))
Офлайн
xam1816Спасибо!!! Что надо срочно изучать функции и библиотеки, основной ход мысли я понял, еще раз спасибо
Офлайн