SON.artov
Июнь 30, 2022 19:35:54
Добрый день, пытаюсь постичь язык 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, почему так, объясните пожалуйста
py.user.next
Июнь 30, 2022 19:37:39
Используй тег code для точной передачи кода
[code python]
здесь пиши код
[/code]
SON.artov
Июнь 30, 2022 19:39:04
На данный момент имею это
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
py.user.next
Июнь 30, 2022 19:52:42
SON.artov
if d_decod[0] <10 and d_decod[0] > 12:
У тебя это условие неправильное. Число не может быть одновременно меньше десяти и больше двенадцати.
От десяти до двенадцати будет так
if 10 <= d_decod[0] <= 12:
SON.artov
Июнь 30, 2022 20:25:05
Я так понимаю что порядок действий должен быть такой:
1. Основной список перебираю (Как вложеные списки “нумеруются”?)
2. Вложенный список по первому значению сравниваю с условием
3. Редактирую/создаю список с отфильтрованными данными.
Беда в том, что не знаю как уже сформулировать вопрос что бы продолжить движение по этому ряду вопросов (( Какие сообщения удалять или переносить привязаны именно к первому значению в списке, интересуют только 10, 11, 12
py.user.next
Июль 1, 2022 01:05:56
xam1816
s_date_raw = int(pd[2:9],16)
s_value = int(pd[10:17], 16)
Не с 2 по 9, а с 2 по 10 должно быть. То же самое для с 10 по 17, должно быть с 10 по 18.
Да и общую процедуру под ворота засовывать неправильно. Почему неправильно - потому что ты это юнит-тестами не покроешь и поэтому не проверишь даже, правильно оно там JSON прочитало или неправильно, правильно оно там первый список сформировало или неправильно, правильно оно там второй список сформировало или неправильно.
В итоге ты имеешь два неправильных диапазона и даже не знаешь об этом, и проверить тебе это нечем, потому что юнит-тестов у тебя нет, а если ты их попытаешься сделать, ты их не сделаешь для этого куска.
Также там неизвестно, а что это за JSON, а могут ли там быть русские буквы или китайские буквы, например. Соответственно, всё это надо протестировать. И только на юнит-тестах ты выяснишь, что нужно указать кодировку при открытии файла, потому что юнит-тесты будут падать. А так у тебя программа будет работать целый месяц в продакшене, а потом раз и придёт JSON на русском языке неожиданно (какой-нибудь там комментарий добавят или описание) и твоя программа прямо во время работы какой-то важной упадёт, потому что этот момент не отлажен. Когда ты станешь её отлаживать, окажется, что она не отлаживается, потому что там юнит-тесты для неё не сделаешь.
Поэтому надо это всё в функции засовывать. И потом эти функции можно проверять юнит-тестами. Также эти функции потом можно импортировать отдельно и пользоваться ими повторно.
SON.artov
Увы получается так:
Я там неправильно написал вначале, сейчас исправил. Попробуй в свой первоначальный код вставь условие.
Попробуем всё это разрешить малой кровью.
SON.artov
Июль 1, 2022 07:45:04
Большое спасибо за советы и помощь, буду разбираться ! ))
SON.artov
Июль 1, 2022 10:10:12
xam1816
Спасибо!!! Что надо срочно изучать функции и библиотеки, основной ход мысли я понял, еще раз спасибо