Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81

Распарсить структуру с проверкой

12.12.2019, 15:41. Показов 1567. Ответов 11

Студворк — интернет-сервис помощи студентам
Есть структура:
G = [C1C, B1B, D2D, C4F]
Буквы в структуре меняются т.е. может быть и такое: G = [M6C, N2B, F4D, C9F]
Есть словарь значений:
D = {'G10': [['4', '5', '7'], ['4', '31', '7', '7'], ['5', '5', '7']],
'G5': [['4', '5', '6', '8'], ['4', '7', '6'], ['3', '5', '6'], ['3', '6', '7']],
'G1': [['3', '4', '6'], ['3', '2', '6'], ['6', '2', '6'], ['4', '2', '6']],
'G2': [['5', '5', '7'], ['3', '6', '7'], ['5', '5', '7','4']],
'G4': [['3', '5', '6', '4'], ['3', '5', '6']]}
1 элемент это C1C, второй B1B и т.д.
Нужно выделить все 1 значения, потом 2 и т.д.:
'G10': [['4'], ['4'], ['5']],
'G5': [['4'], ['4'], ['3'], ['3']],
'G1': [['3'], ['3'], ['6'], ['4']],
'G2': [['5'], ['3'], ['5']],
'G4': [['3'], ['3']]

Далее сделать из них общий список значений для каждого элемента в структуре:

G_Mass1 = [['4', '4', '5'],
['4', '4', '3', '3'],
['3', '3', '6', '4'],
['5', '3', '5'],
['3', '3']]
G_Mass2 = ....
G_Mass3 = ....
G_Mass4 = ....
То есть я уже знаю, что здесь G_Mass1[0][0] это 1 значение G10 и это значение относиться к структуре G[0] т.е. C1C.
Сделать проверку структуры: к примеру: G_Mass4[0][3] это значение '4' которое относиться к структуре G[3] т.е. C4F.
Мои попытки:
1) Не могу разобраться как распарсить 4 элемент (C4F)
2) Писал на сколько знал, конечно много мусора, да и совсем недавно пытаюсь кодить, хотелось бы сократить код.
3) Из за того что не разобрался с 4 элементом, проверку не делал.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
G = ['C1C', 'B1B', 'D2D', 'C4F']
D = {'G10': [['4', '5', '7'], ['4', '31', '7', '7'], ['5', '5', '7']],
     'G5': [['4', '5', '6', '8'], ['4', '7', '6'], ['3', '5', '6'], ['3', '6', '7']],
     'G1': [['3', '4', '6'], ['3', '2', '6'], ['6', '2', '6'], ['4', '2', '6']],
     'G2': [['5', '5', '7'], ['3', '6', '7'], ['5', '5', '7','4']],
     'G4': [['3', '5', '6', '4'], ['3', '5', '6']]}
Dkey = []                                 # Формируем кейсу число для обращения к нему.
for key in D.keys():
    Dkey.append(key)
G[0] = []
G[1] = []
G[2] = []
G[3] = []
k = 0
i = 0
while k < len(D):
      h = 0
      while h < len(D[str(Dkey[i])]):
            G[0].append([i, D[str(Dkey[i])][h][0]])
            G[1].append([i, D[str(Dkey[i])][h][1]])
            G[2].append([i, D[str(Dkey[i])][h][2]])
            if len(D[str(Dkey[i])][h]) > 3:
                  G[3].append([i, D[str(Dkey[i])][h][3]])
                 # print (mass_values_obs_G[str(keyValuesG[i])][h][0][3])
            #print (mass_values_obs_G[str(keyValuesG[i])][h][0])
            h+=1
      i+=1
      k+=1
#print(G[0])
#print(G[1])
#print(G[3])
def flat_list(array, new_list=None):
    if new_list is None:
        new_list = []
    for i in array:
        if type(i) == int:
            new_list.append(i)
        elif type(i) == str:
            new_list.append(i)
        elif type(i) == float:
            new_list.append(i)
        else:
            flat_list(i, new_list)
    return new_list
 
Mass_New1 = flat_list(G[0])
Mass_New2 = flat_list(G[1])
Mass_New3 = flat_list(G[2])
Mass_New4 = flat_list(G[3])
 
#print (Mass_New4)
 
def Mass(N):
      dct = {}
      for i in range(0, len(N), 2): # Выделяем последовательность значений
          key, val = N[i: i+2]
          dct.setdefault(key,[]).extend([val]) # Если ключи повторяются, добавляем значения.
      return (dct)
G_C1C = []
G_B1B = []
G_D2D = []
#G_C4F= []
i=0
while i < len(Mass(Mass_New1)): # Тут можно сделать еще один цикл, но т.к. 4 не работает не знаю
      G_C1C.append(Mass(Mass_New1)[i])
      i+=1
#print(G_C1C)
i=0
while i < len(Mass(Mass_New2)):
      G_B1B.append(Mass(Mass_New2)[i])
      i+=1
#print(G_B1B)
i=0
while i < len(Mass(Mass_New3)):
      G_D2D.append(Mass(Mass_New3)[i])
      i+=1
#print(G_D2D)
#i=0
#while i < len(Mass(Mass_New4)):
#      G_C4Fappend(Mass(Mass_New4)[i])
#      i+=1
#print(G_C4F)
Вывод:
[['4', '4', '5'], ['4', '4', '3', '3'], ['3', '3', '6', '4'], ['5', '3', '5'], ['3', '3']]
[['5', '31', '5'], ['5', '7', '5', '6'], ['4', '2', '2', '2'], ['5', '6', '5'], ['5', '5']]
[['7', '7', '7'], ['6', '6', '6', '7'], ['6', '6', '6', '6'], ['7', '7', '7'], ['6', '6']]
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2019, 15:41
Ответы с готовыми решениями:

Распарсить многоуровневую переменную структуру
Здравствуйте. Помогите распарсить нижеприведенную структуру. Если бы структура была постоянной, то проблем нет. Но количество параметров,...

Распарсить строку и записать значения в структуру
Всем привет, не могу сделать следующие: нужно распарсить определенную строку, на определенные части, затем эти части записать в структуру ...

Распарсить нестандартную структуру и заполнить ею ячейки
Добрый день ! Посдкажите пожалуйста, как распарсить вот такую структуру и получить что-то удобочитаемое для VBA, что бы обращаться к...

11
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
12.12.2019, 16:21
Getter17, но в большинстве значений-списков менее 4 элементов, что тогда возвращать?
0
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81
13.12.2019, 09:49  [ТС]
Welemir1, Я думал может забить пустые значения нулями, но я еще не понял, как это сделать, должно получится для C4F примерно такое: [['0', '7', '0'],[ '8', 0, '0', '0'],['0', '0', '4'], ['4', '0']], это мне нужно для формул далее.

Добавлено через 19 минут
Welemir1, но для этого нужно изменить основной список, добавить '0' в конце каждого под-списка длина которого меньше максимальной длины под-списка в ключе и так для каждого ключа т.е:
'G10': [['4', '5', '7', '0'], ['4', '31', '7', '7'], ['5', '5', '7', '0']] ....
т.е. сравнивать под-списки с длиной максимально большого под-списка в ключе и добавлять в конец '0' , если не равен длине максимально большого под-списка. Как то так.

Добавлено через 11 минут
Welemir1, основной словарь.
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.12.2019, 09:55
Ты можешь добавлять значения в конец списка, просто используя append()

Добавлено через 43 секунды
Проверяешь одномерный список на длину, если он меньше того, что тебе надо используешь append()

Добавлено через 28 секунд
Так ты и заполнишь список нулями или чем надо.

Добавлено через 2 минуты
Python
1
2
3
4
5
mass = [['4', '5', '7'], ['4', '31', '7', '7'], ['5', '5', '7']]
for i in mass:
    if len(i) < 4:
        i.append(0)
print(mass)
Добавлено через 25 секунд
Вывод: [['4', '5', '7', 0], ['4', '31', '7', '7'], ['5', '5', '7', 0]]
0
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81
13.12.2019, 11:30  [ТС]
Damenikx, крутил, вертел, вышло коряво, но то что хотел сделал, 100% есть способ распарсить выше структуру в несколько строк, знать бы, только как.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
D = {'G10': [['4', '5', '7'], ['4', '31', '7', '7'], ['5', '5', '7']],
     'G5': [['4', '5', '6', '8'], ['4', '7', '6'], ['3', '5', '6'], ['3', '6', '7']],
     'G1': [['3', '4', '6'], ['3', '2', '6'], ['6', '2', '6'], ['4', '2', '6']],
     'G2': [['5', '5', '7'], ['3', '6', '7'], ['5', '5', '7','4']],
     'G4': [['3', '5', '6', '4'], ['3', '5', '6']]}
Dkey = []                                 # Формируем кейсу число для обращения к нему.
DlinaDkey = []                          # Длины каждого из под-списков))))
for key in D.keys():
    Dkey.append(key)
h = 0
while h < len(Dkey):
      DlinaDkey.append(len(max(D[str(Dkey[h])]))) # Максимальная длина каждого под-списка)))
      h+=1
print (max(DlinaDkey))
k = 0
while k < len(Dkey):
 
      for i in D[str(Dkey[k])]:
            if len(i) < max(DlinaDkey):        # Специально для 'G1' выделяем максимум из всех длин под-списков)))
                  i.append(0)
      k+=1
print (D)
Вывод: {'G10': [['4', '5', '7', 0], ['4', '31', '7', '7'], ['5', '5', '7', 0]],
'G5': [['4', '5', '6', '8'], ['4', '7', '6', 0], ['3', '5', '6', 0], ['3', '6', '7', 0]],
'G1': [['3', '4', '6', 0], ['3', '2', '6', 0], ['6', '2', '6', 0], ['4', '2', '6', 0]],
'G2': [['5', '5', '7', 0], ['3', '6', '7', 0], ['5', '5', '7', '4']],
'G4': [['3', '5', '6', '4'], ['3', '5', '6', 0]]}
Ну и далее с таким словарем парсится струтура C4F. Но увы это очень длинный код и скорее всего корявый.

Добавлено через 6 минут
Damenikx, вот к примеру добавил я в под-список 'G10' 5 значение [['4', '5', '7'], ['4', '31', '7', '7', '5'], ['5', '5', '7']] т.к такое тоже может быть и я это не подумал сразу, теперь нужно делать еще цикл, для того чтобы добавлялся не один 0 а два, три и т.д, либо же проверял длину под-списка, сравнивал с длиной (max(n)-1) +=1 добавлял '0', опять заморочка)))
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.12.2019, 12:18
Getter17, создайте переменную, которая будет содержать необходимую длину подсписка и проверяйте, если меньше - заполняем нулями. Вы сделали правильно, проверяете длину максимальной строки, а разницу остальных строк заполняете нулями. В чём заморочка? Не знаете как написать?

Добавлено через 39 секунд
Можно сделать всё в одном цикле. Сначала проверяем длину, заполняем, делаем, что надо.

Добавлено через 1 минуту
Getter17, я бы не сказал, что у Вас корявый код, у меня обычно - ещё коряеве
0
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81
13.12.2019, 15:03  [ТС]
Damenikx, Я сделал немного иначе, ввиду всей кривизны, получилось, теперь неважно сколько элементов и значений в структуре)))
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
D = {'G10': [['4', '5', '7', '4'], ['4', '31', '7', '7', '5'], ['5', '5', '7']],
     'G5': [['4', '5', '6', '8'], ['4', '7', '6'], ['3', '5', '6','8','4'], ['3', '6', '7']],
     'G1': [['3', '4', '6'], ['3', '2', '6'], ['6', '2', '6'], ['4', '2', '6']],
     'G2': [['5', '5', '7'], ['3', '6', '7'], ['5', '5', '7','4']],
     'G4': [['3', '5', '6', '4'], ['3', '5', '6']]}
def Dkey(Mass):                                 # Формируем кейсу число для обращения к нему.
      Dkey = []
      for key in D.keys():
          Dkey.append(key)
      return (Dkey)
def MaxDlinaMass(Mass):                            # Длины каждого из под-списков))))
      DlinaDkey = []
      h = 0
      while h < len(Dkey(D)):
            DlinaDkey.append(len(max(D[str(Dkey(D)[h])],key = len))) # Максимальная длина каждого под-списка)))
            h+=1
      return (DlinaDkey)
def Dobavlenie0(Mass):
      Dlina = MaxDlinaMass(Mass)
      k = 0
      while k < len(Dkey(D)):
            for i in D[str(Dkey(D)[k])]:
                  if len(i) < max(Dlina):        # Специально для 'G1' выделяем максимум из всех длин под-списков)))
                        i.append(0)
            k+=1
      return (Mass)
i = 0
DGeneral = []
while i < max(MaxDlinaMass(D)):                 # Повторяем добавление 0 в конец min под-списка
      DGeneral.append((i, Dobavlenie0(D)))
      i+=1
DNew = DGeneral[max(MaxDlinaMass(D))-1][1]
print (DNew)
Вывод:
{'G10': [['4', '5', '7', '4', 0], ['4', '31', '7', '7', '5'], ['5', '5', '7', 0, 0]],
'G5': [['4', '5', '6', '8', 0], ['4', '7', '6', 0, 0], ['3', '5', '6', '8', '4'], ['3', '6', '7', 0, 0]],
'G1': [['3', '4', '6', 0, 0], ['3', '2', '6', 0, 0], ['6', '2', '6', 0, 0], ['4', '2', '6', 0, 0]],
'G2': [['5', '5', '7', 0, 0], ['3', '6', '7', 0, 0], ['5', '5', '7', '4', 0]],
'G4': [['3', '5', '6', '4', 0], ['3', '5', '6', 0, 0]]}

Добавлено через 5 минут
Damenikx, Вопрос еще в другом насколько def и вся эта кривизна будет загружать систему, просто на примере это делается быстро, а когда файл и записей в файле на (24 часа+) то я даже не знаю как быть по быстродействию.
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
13.12.2019, 15:26
Надо оптимизировать, почитать литературу, подождать пока более умные форумчане прочтут тему.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.12.2019, 15:59
Лучший ответ Сообщение было отмечено Getter17 как решение

Решение

Исхожу из :
Цитата Сообщение от Getter17 Посмотреть сообщение
Вывод:
[['4', '4', '5'], ['4', '4', '3', '3'], ['3', '3', '6', '4'], ['5', '3', '5'], ['3', '3']]
[['5', '31', '5'], ['5', '7', '5', '6'], ['4', '2', '2', '2'], ['5', '6', '5'], ['5', '5']]
[['7', '7', '7'], ['6', '6', '6', '7'], ['6', '6', '6', '6'], ['7', '7', '7'], ['6', '6']]
и
Цитата Сообщение от Getter17 Посмотреть сообщение
примерно такое: [['0', '7', '0'],[ '8', 0, '0', '0'],['0', '0', '4'], ['4', '0']]
Python
1
2
3
4
5
6
7
8
9
10
11
a_dict = {'G10': [['4', '5', '7'], ['4', '31', '7', '7'], ['5', '5', '7']],
          'G5': [['4', '5', '6', '8'], ['4', '7', '6'], ['3', '5', '6'], ['3', '6', '7']],
          'G1': [['3', '4', '6'], ['3', '2', '6'], ['6', '2', '6'], ['4', '2', '6']],
          'G2': [['5', '5', '7'], ['3', '6', '7'], ['5', '5', '7', '4']],
          'G4': [['3', '5', '6', '4'], ['3', '5', '6']]}
 
result = []
for i in range(4):
    result.append([[inner[i] if len(inner) > i else '0' for inner in v] for k, v in a_dict.items()])
for line in result:
    print(line)
вывод
Python
1
2
3
4
[['4', '4', '5'], ['4', '4', '3', '3'], ['3', '3', '6', '4'], ['5', '3', '5'], ['3', '3']]
[['5', '31', '5'], ['5', '7', '5', '6'], ['4', '2', '2', '2'], ['5', '6', '5'], ['5', '5']]
[['7', '7', '7'], ['6', '6', '6', '7'], ['6', '6', '6', '6'], ['7', '7', '7'], ['6', '6']]
[['0', '7', '0'], ['8', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '4'], ['4', '0']]
1
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81
13.12.2019, 16:36  [ТС]
Welemir1, наверно это магия
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.12.2019, 16:37
Getter17, очень древнее колдунство, еще от египетских жрецов)))
Хочешь также? марк Лутц, "Изучаем пайтон", страниц много но там магия!
0
0 / 0 / 0
Регистрация: 16.03.2019
Сообщений: 81
13.12.2019, 16:42  [ТС]
Welemir1, Благодарю, боюсь смотреть туда даже, если только глазком
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2019, 16:42
Помогаю со студенческими работами здесь

Как создать структуру, где будут поля с указателями на эту же структуру?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct DoubleQueue { queue* ar; queue* al; int data; }...

объявить динамическую структуру данных, выделить память под указатель на структуру
Написать программу, в которой нужно объявить динамическую структуру данных с именем Node и поля Name, Value и Next, выделить память под...

Объявить динамическую структуру данных, выделить память под указатель на структуру
Написать программу, в которой нужно объявить динамическую структуру данных с именем Hole и поля Name, Value и Next, выделить память под...

Как создать структуру-список, поля которой — ссылка на такую же структуру
Суть вопроса в том, как создать структуру-список, поля которой - ссылка на сл. элемент(такую же структуру) и ссылка на объект, относящийся...

Реализуйте структуру данных, представляющую собой расширенную структуру стек
Реализуйте структуру данных, представляющую собой расширенную структуру стек. Необходимо поддерживать добавление элемента на вершину...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru