Как динамически создать список dict с помощью Python

У меня есть этот ввод для обработки:

['', '', '', '', '  Huawei Integrated Access Software (MA5600T).', '  Copyright(C) Huawei Technologies Co., Ltd. 2002-2014. All rights reserved.', '', '  -----------------------------------------------------------------------------', '  User last login information:', '  -----------------------------------------------------------------------------', '  Access Type : Telnet ', '  IP-Address  : 1.1.1.1', '  Login  Time : 2020-12-24 11:51:33+01:00', '  Logout Time : 2020-12-24 11:51:38+01:00', '  -----------------------------------------------------------------------------', '', 'OLT-SALUZZO_01>enable', '', 'OLT-SALUZZO_01#display ont autofind all \x1b[1D\x1b[1C', '   ----------------------------------------------------------------------------', '   Number              : 1', '   F/S/P               : 0/17/7', '   Ont SN              : 485754437D85CA9E (HWTC-7D85CA9E)', '   Password            : 0x00000000000000000000', '   Loid                : ', '   Checkcode           : ', '   VendorID            : HWTC', '   Ont Version         : 159D.A', '   Ont SoftwareVersion : V5R019C00S100', '   Ont EquipmentID     : EG8145V5', '   Ont autofind time   : 2020-12-24 08:38:28+01:00', '   ----------------------------------------------------------------------------', '   Number              : 2', '   F/S/P               : 0/17/7', '   Ont SN              : 48575443A9517A9E (HWTC-A9517A9E)', '   Password            : 0x00000000000000000000', '   Loid                : ', '   Checkcode           : ', '   VendorID            : HWTC', '   Ont Version         : 159D.A', '   Ont SoftwareVersion : V5R019C00S100', '   Ont EquipmentID     : EG8145V5', "---- More ( Press 'Q' to break ) ----"]

и мне нужно создать из этого вывод следующим образом:

[{'F/S/P': '0/17/7', 'SN': ' 485754437D85CA9E', 'Password': None}, {'F/S/P': '0/17/7', 'SN': '48575443A9517A9E ', 'Password': None}]

Моя функция примерно такая:

tn.write("display ont autofind all ".encode('utf-8') + b"\n")
return_lineid = tn.read_until('The number of GPON'.encode('utf-8'), 3).decode('utf-8')
data_return = return_lineid.splitlines()
autofind_list=[]
records = []
current_record = {}
for line in data_return:
    line = line.strip()
    if not line:  # empty line
        records.append(current_record)
        current_record = {}
    else:
        if "F/S/P" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            current_record[key] = value
            print(current_record)
        if "Ont SN" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            value = re.sub(r'\(.*\)', '', value)
            current_record[key] = value
            print(current_record)
        if "Password" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            if value == '0x00000000000000000000':
                current_record[key]=None
            else:
                current_record[key] = value

        autofind_list.append(current_record.copy())

#for removing same records
seen = set()
new_l = []
for d in autofind_list:
    t = tuple(d.items())
    if t not in seen:
        seen.add(t)
        new_l.append(d)

print(new_l)

Но он возвращает это, я почти достиг своей цели:

[{}, {'F/S/P': '0/17/7'}, {'F/S/P': '0/17/7', 'Ont SN': '485754437D85CA9E '}, {'F/S/P': '0/17/7', 'Ont SN': '485754437D85CA9E ', 'Password': None}, {'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E ', 'Password': None}]

Но я хотел бы удалить бесполезный объект, такой как {}, {'F/S/P': '0/17/7'}

Кто-нибудь может помочь мне с этой проблемой? или может подскажете?

заранее спасибо

«каждый раз что-то не так, например вот это» — в чем конкретная проблема с этим выводом? Пожалуйста, прочтите Как спросить. Сделайте это как можно проще для нас, чтобы помочь вам.

Chris 23.12.2020 17:30

(Примечание: ни один из них не является JSON, который поддерживает только строки в двойных кавычках и использует null, а не None. Я подозреваю, что у вас действительно есть списки Python, содержащие словари.)

Chris 23.12.2020 17:31

Этот вывод одинаков каждый раз, если вы читаете

snuz 23.12.2020 17:37

Да, мне понадобится json или что-то подобное, я думаю, что мой вопрос вполне ясен

snuz 23.12.2020 17:39

«Если вы читаете, этот вывод каждый раз один и тот же» — значит, вы ожидаете, что мы заметим разницу между «485754437D85CA9E» и «48575443A9517A9E», скрытую в длинных выводах, которые нам нужно прокручивать вбок, чтобы прочитать? Еще раз, пожалуйста, прочитайте Как спрашивать , особо отметив рекомендацию «представить, что вы разговариваете с занятым коллегой». Различия в этих значениях должны быть четко указаны в вашем вопросе. И в идеале вы должны предоставить минимальный воспроизводимый пример. Здесь много кода, который ничего не делает, кроме как отвлекает.

Chris 23.12.2020 17:46

Кроме того, исправьте код Python. Как сейчас написано, он сгенерирует IndentationError. Сколько этого должно быть в теле autofind()? Вставьте свой код, затем выберите его и нажмите кнопку {} или нажмите Ctrl+K, чтобы отформатировать его как код.

Chris 23.12.2020 17:49

Проблема здесь в том, что у вас есть только один autofind_object, и вы постоянно перезаписываете его. Попробуйте переместить autofind_object = {} в свой цикл или заменить autofind_list.append(autofind_object) на autofind_list.append(autofind_object.copy()).

Chris 23.12.2020 17:51

@Chris Большое спасибо, как я могу удалить бесполезные объекты, такие как {} или что-то вроде {'F/S/P': '0/17/7'} без всех необходимых мне параметров?

snuz 24.12.2020 10:02

@ Крис, не могли бы вы перепроверить мой вопрос? Я отредактировал это... Спасибо

snuz 24.12.2020 11:43

Вставьте свой autofind_list.append(current_record.copy()) в блок else, чтобы он работал только тогда, когда line соответствует действительности.

Chris 24.12.2020 13:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
11
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что вы планировали с этим autofind_list, но я предполагаю, что это была ваша попытка решить проблему, связанную с отсутствием одной записи в records. Это можно решить, просто добавив current_record после завершения цикла.

Тогда единственная проблема - это первая пустая запись, потому что в начале есть ненужная пустая строка. Это можно сделать, просто проверив, заполнена ли current_record, прежде чем добавлять ее в records (это также предотвращает проблемы, если две пустые строки идут подряд).

Вот полный код:

records = []
current_record = {}
for line in data_return:
    line = line.strip()
    if not line:  # empty line
        if current_record: # no data recorded
            records.append(current_record)
            current_record = {}
    else:
        if "F/S/P" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            current_record[key] = value
        if "Ont SN" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            value = re.sub(r'\(.*\)', '', value)
            current_record[key] = value
        if "Password" in line:
            key, value = line.split(':')
            key = key.strip()
            value = value.strip()
            if value == '0x00000000000000000000':
                current_record[key] = None
            else:
                current_record[key] = value

if current_record:
    records.append(current_record)

records теперь включает в себя список, я думаю, вы хотите.


Поскольку данные вашего примера в сообщении на самом деле не представляют введенные вами данные, в которых записи разделены ---- линиями, состоящими только из тире, вам нужно заменить if not line: на if not line or set(line) == {'-'}:.

он возвращает только одну запись: [{'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E', 'Пароль': None}]

snuz 24.12.2020 12:03

@snuz Это не для меня. Можете ли вы привести пример ввода? Через пастебин?

MegaIng 24.12.2020 12:28

все это описано в вопросе, ввод, который мне нужно обработать, это первое, что я написал в вопросе

snuz 24.12.2020 12:31

@snuz И этот ввод работает для меня. Вы уверены, что у вас есть последние несколько строк моего ответа?

MegaIng 24.12.2020 12:31

Да. Я уверен! если я печатаю «записи», он печатает только «[{'F/S/P': '0/17/7', 'Ont SN': '48575443A9517A9E', 'Пароль': None}]'

snuz 24.12.2020 12:37

@snuz Ну, можешь добавить print(data_return) и дать мне результат?

MegaIng 24.12.2020 12:43

Он добавляет только последнюю текущую запись вашего кода

snuz 24.12.2020 12:44

@snuz У меня работает, значит, что-то с твоей стороны не так. Поскольку единственное сообщение об ошибке, которое я получаю от вас, это «это не работает», я не могу вам помочь.

MegaIng 24.12.2020 12:45

Куда я могу отправить вам вывод?

snuz 24.12.2020 12:46

@snuz Эти данные в другом формате. Записи разделены строками, содержащими только дефисы.

MegaIng 24.12.2020 12:54

да, я знаю, но почему он вообще может читать записи?

snuz 24.12.2020 12:57

Если я распечатаю current_record, все в порядке

snuz 24.12.2020 12:58

@snuz Код добавляется к records только в пустой строке, так как вы сказали мне, что это правильно.

MegaIng 24.12.2020 12:59
pastebin.com/9sHekevF это вывод, если я печатаю current_record в цикле. В любом случае, вывод, который мне нужен, вы можете увидеть в вопросе.
snuz 24.12.2020 13:01

@snuz Я добавил код в ответ. Тогда это работает?

MegaIng 24.12.2020 13:03

@snuz Также, пожалуйста, обновите свой вопрос, чтобы он содержал фактический ввод, а не то, что вы считаете вводом.

MegaIng 24.12.2020 13:04

Извините... Я хотел бы спросить вас напоследок, как я могу получить доступ к предметам? Например для получения только 17.00.7 из записей?

snuz 24.12.2020 15:15

@snuz Я не уверен, что ты имеешь в виду. Вы можете открыть новый вопрос, если это что-то новое.

MegaIng 24.12.2020 15:54

Я имею в виду получение значения в списке

snuz 24.12.2020 16:43

Другие вопросы по теме