Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2022 19:35:54

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

Добрый день, пытаюсь постичь язык 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, почему так, объясните пожалуйста

Офлайн

#2 Июнь 30, 2022 19:37:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

Используй тег code для точной передачи кода

[code python]
здесь пиши код
[/code]



Офлайн

#3 Июнь 30, 2022 19:39:04

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

На данный момент имею это

 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

Прикреплённый файлы:
attachment json.txt (3,7 KБ)

Офлайн

#4 Июнь 30, 2022 19:52:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

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)

Офлайн

#5 Июнь 30, 2022 20:21:24

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

py.user.next
Увы получается так:

Прикреплённый файлы:
attachment 2022-06-30_20-20-44.png (23,4 KБ)

Офлайн

#6 Июнь 30, 2022 20:25:05

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

Я так понимаю что порядок действий должен быть такой:
1. Основной список перебираю (Как вложеные списки “нумеруются”?)
2. Вложенный список по первому значению сравниваю с условием
3. Редактирую/создаю список с отфильтрованными данными.
Беда в том, что не знаю как уже сформулировать вопрос что бы продолжить движение по этому ряду вопросов (( Какие сообщения удалять или переносить привязаны именно к первому значению в списке, интересуют только 10, 11, 12

Отредактировано SON.artov (Июнь 30, 2022 20:27:44)

Офлайн

#7 Июнь 30, 2022 23:12:18

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

  
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')

Офлайн

#8 Июль 1, 2022 01:05:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

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
Увы получается так:
Я там неправильно написал вначале, сейчас исправил. Попробуй в свой первоначальный код вставь условие.

Попробуем всё это разрешить малой кровью.



Отредактировано py.user.next (Июль 1, 2022 01:28:39)

Офлайн

#9 Июль 1, 2022 07:45:04

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

Большое спасибо за советы и помощь, буду разбираться ! ))

Офлайн

#10 Июль 1, 2022 10:10:12

SON.artov
Зарегистрирован: 2022-06-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Добрый день, Прошу ПОМОЩИ!

xam1816
Спасибо!!! Что надо срочно изучать функции и библиотеки, основной ход мысли я понял, еще раз спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version