1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958

Преобразовать список со словарями в список с объектами

24.03.2021, 00:10. Показов 1535. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть class Item
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Item:
    def __init__(self, type, model, cost):
        self.type = type
        self.model = model
        self.cost = cost
items1 = [
    {"type": "Phone", "model": "Samsung A10", "cost": 24599},
    {"type": "Notebook", "model": "Lenovo Ideapad 5", "cost": 48200},
    {"type": "Notebook", "model": "HP 255", "cost": 40190},
    {"type": "Phone", "model": "Xiaomi Redmi 9", "cost": 12980},
    {"type": "Headphones", "model": "Apple AirPods Pro", "cost": 18900},
    {"type": "Headphones", "model": "Sennheiser HD 206", "cost": 1235},
]
Преобразовать список со словарями в список с объектами
Вывести все товары в виде нумерованного списка, в формате:
1. Phone "Xiaomi Redmi 9" 12980 rub.
2. Phone ...
то есть сначала тип товара с заглавной буквы, затем наименование в кавычках, затем цена с указанием валюты
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2021, 00:10
Ответы с готовыми решениями:

Как упорядочить список со словарями?
доброго времени суток! подскажите пожалуйста, как исполнить что то подобное : d = //список со словарями упорядочить следующим...

pandas from_records не воспринимает список со словарями
Есть XML-документ <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <Voice schema="1" version="Multy"> <BaseProduct...

Список: Преобразовать список так, чтобы сначала шли нечетные элементы, а потом четные
Преобразовать список таким образом, чтобы в первой его половине располагались элементы, стоявшие на нечетных позициях, а во второй...

18
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.03.2021, 02:49
Whitecolor, Как я понимаю у Вас это прайс-лист товаров, а не сами товары. Для товаров нужно было бы добавить еще инвентарный номер, что бы каждый товар был уникальным.
В прайс листе уникальность обеспечивается названием модели.
Что бы создать объект как экземпляр класса Item нужно для каждого объекта создавать переменную с именем соответствующем модели.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Item:
    def __init__(self, type, model, cost):
        self.type = type
        self.model = model
        self.cost = cost
 
if __name__ == '__main__':
    Samsung_A10 = Item("Phone", "Samsung A10", 24599)
 
    # аналогично для всех моделей
    # и занести эти объекты в список
 
    list_items1 = [Samsung_A10, ... ]     # и так далее
 
    print(Samsung_A10.type, Samsung_A10.model, Samsung_A10.cost)
    # Но более правильно формат вывода на печать оформлять в виде метода __str__ в классе.
Добавлено через 5 минут
Whitecolor, При необходимости с помощью цикла for, можно автоматизировать взятие данных из словаря, создание экземпляров класса и занесение их в список.

Добавлено через 2 минуты
Whitecolor, Но в этом случае переменные (название объектов) нужно будет создавать динамически.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
24.03.2021, 06:14
Whitecolor, про сортировку ничего не было, посему
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
>>> class Item:
...     def __init__(self, type, model, cost):
...         self.type = type
...         self.model = model
...         self.cost = cost
...
>>> items1 = [
...     {"type": "Phone", "model": "Samsung A10", "cost": 24599},
...     {"type": "Notebook", "model": "Lenovo Ideapad 5", "cost": 48200},
...     {"type": "Notebook", "model": "HP 255", "cost": 40190},
...     {"type": "Phone", "model": "Xiaomi Redmi 9", "cost": 12980},
...     {"type": "Headphones", "model": "Apple AirPods Pro", "cost": 18900},
...     {"type": "Headphones", "model": "Sennheiser HD 206", "cost": 1235},
... ]
>>> real_items = [Item(*list(e.values())) for e in items1]
>>> for index, item in enumerate(real_items,1):
...     print(f'{index}. {item.type} "{item.model}" {item.cost} rub')
...
1. Phone "Samsung A10" 24599 rub
2. Notebook "Lenovo Ideapad 5" 48200 rub
3. Notebook "HP 255" 40190 rub
4. Phone "Xiaomi Redmi 9" 12980 rub
5. Headphones "Apple AirPods Pro" 18900 rub
6. Headphones "Sennheiser HD 206" 1235 rub
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.03.2021, 09:11
Welemir1, Формально Ваше решение соответствует условию задачи. Но для создания базы данных с помощью модуля shelve , на сколько я помню, нужно что бы экземпляры класса имели имена в виде переменных, которые содержат ссылки на эти объекты.
Пример из Лутц М. Программирование на Python. Том 1 (4-е издание, 2011)
Python
1
2
3
4
5
6
7
8
9
10
11
>>> import shelve
>>> db = shelve.open('people-shelve’)
>>> bob = db['bob']
>>> bob['name'].split()[-1] # вернет фамилию Боба
'Smith'
>>> sue = db['sue']
>>> sue['pay'] *= 1.25 # увеличит оклад Сью
>>> sue['pay']
75000.0
>>> db['sue'] = sue
>>> db.close()
Не знаю, можно ли создать и полноценно работать с базой данных (БД) созданной с помощью модуля shelve, не присваивая каждому экземпляру класса имя (переменную), но Лутц делает так и я всегда в своих проектах делал аналогично.
Если же ограничиваться Вашим решением, то создать полноценную БД, которая сохраняется на диске, я думаю проблематично.
Но может я и ошибаюсь.
Просто я не пробовал создавать аналогичную БД не так как у Лутца. Действовал всегда по одному шаблону.

Добавлено через 15 минут
Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) Часть I . Начало. стр. 39-123
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
24.03.2021, 09:12
Viktorrus, ТС даже не упоминал про сериализацию. При чем тут shelve?
Если надо, при таких незначительных объемах можно тупо сохранять это все в json и не париться.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
24.03.2021, 09:17
Цитата Сообщение от Viktorrus Посмотреть сообщение
Но для создания базы данных с помощью модуля shelve
я просто не знал что тут нужен шелве, не думал про него.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.03.2021, 09:25
iSmokeJC, Просто я, когда пишу код, стремлюсь, что бы его реально можно было использовать на практике. Без сохранения в базе данных такая задача не имеет смысла. Разве только в качестве упражнения. для учащихся.
Просто я почему то решил, что ТС хочет это решение использовать на практике у себя на работе.
Каюсь, самостоятельно расширил условие.

Добавлено через 6 минут
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Если надо, при таких незначительных объемах можно тупо сохранять это все в json и не париться.
Если это пример из прайс листа для магазина, то там всегда значительные объемы. И большие запросы на работу с БД. json не обладает такими возможностями для обработки данных как БД на shelve.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
24.03.2021, 09:51
Viktorrus, в больших объемах никто не занимается подобной ерундой, а использует таки полноценную БД. Какой-нибудь Postgres например.
0
1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958
24.03.2021, 10:01  [ТС]
Я только на стадии изучения Python.
Не лучше в первой части задачи использовать наиболее простое решение?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Item:
    def __init__(self, type, model, cost):
        self.type = type
        self.model = model
        self.cost = cost
items1 = [
    {"type": "Phone", "model": "Samsung A10", "cost": 24599},
    {"type": "Notebook", "model": "Lenovo Ideapad 5", "cost": 48200},
    {"type": "Notebook", "model": "HP 255", "cost": 40190},
    {"type": "Phone", "model": "Xiaomi Redmi 9", "cost": 12980},
    {"type": "Headphones", "model": "Apple AirPods Pro", "cost": 18900},
    {"type": "Headphones", "model": "Sennheiser HD 206", "cost": 1235},
]
items2 = []
for i in items1:
    items2.append(Item(i["type"], i["model"], i["cost"]))
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.03.2021, 12:38
Цитата Сообщение от Whitecolor Посмотреть сообщение
Я только на стадии изучения Python
Если это учебный пример, то я свой комментарий со своим предложением снимаю.

Добавлено через 9 минут
Whitecolor, Если брать Ваше решение, то зачем Вам класс? Вы в своем коде не создаете экземпляров класса Item. А просто создаете список в качестве элементов которого являются не экземпляры класса Item, а значения из словарей.
Выкиньте из Вашего кода класс, и он будет так же работать, как и с классом (который в Вашем коде не используется).
Для Вашей задачи наиболее правильное решение дал Welemir1,

Добавлено через 8 минут
Цитата Сообщение от Whitecolor Посмотреть сообщение
Преобразовать список со словарями в список с объектами
Условие задачи не корректно, так как словари в Вашем списком и так являются объектами. Тогда в чем смысл преобразования? Если же под объектами подразумеваются объекты класса, то ваше решение не верно, так как Вы не создаете объекты класса. А верное решение с созданием объектов класса дал Вам Welemir1,

Добавлено через 17 минут
Whitecolor, А вот, если кому интересно, динамическое создание именованных экземпляров класса, на базе указанного выше списка словарей. Которые можно использовать для сохранения в БД модуля shelve.
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
class Item:
    def __init__(self, type, model, cost):
        self.type = type
        self.model = model
        self.cost = cost
 
items1 = [
    {"type": "Phone", "model": "Samsung A10", "cost": 24599},
    {"type": "Notebook", "model": "Lenovo Ideapad 5", "cost": 48200},
    {"type": "Notebook", "model": "HP 255", "cost": 40190},
    {"type": "Phone", "model": "Xiaomi Redmi 9", "cost": 12980},
    {"type": "Headphones", "model": "Apple AirPods Pro", "cost": 18900},
    {"type": "Headphones", "model": "Sennheiser HD 206", "cost": 1235},
]
 
if __name__ == '__main__':
 
    for d in items1:
        lst_ = []
        for key in d.keys():
            if key == "type": lst_.insert(0, d["type"])
            elif key == "model": lst_.insert(1, d["model"])
            elif key == "cost": lst_.insert(2, d["cost"])
        val = d['model'].replace(' ', '_')
        exec(val + '= Item(*lst_)')
        #print(Samsung_A10)
 
    print(Samsung_A10.type, Samsung_A10.model, Samsung_A10.cost)
0
1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958
24.03.2021, 13:39  [ТС]
Viktorrus,
Python
1
2
for i in items1:
    items2.append(Item(i["type"], i["model"], i["cost"]))
Разве здесь список будет состоять не из объектов?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
24.03.2021, 13:42
Цитата Сообщение от Whitecolor Посмотреть сообщение
Не лучше в первой части задачи использовать наиболее простое решение?
да, лучше. Я бы правда не стал использовать атрибут с именем type на твоем месте, а в остальном годно
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.03.2021, 21:41
Цитата Сообщение от Whitecolor Посмотреть сообщение
Разве здесь список будет состоять не из объектов?
Прошу прощения, посмотрел не внимательно. Да действительно, имя класса с круглыми скобками после него, создает не именованный экземпляр класса. К нему можно обращаться по положению в списке.
0
1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958
25.03.2021, 01:50  [ТС]
По второй части задачи, такое решение подойдет
Python
1
2
3
4
num = 1
for i in items2:
    print('{}.'.format(num), i.type, '"{}"'.format(i.model), i.cost, "rub.")
    num += 1
Или есть более оптимальный способ решения?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
25.03.2021, 06:16
Whitecolor, то есть ты мое решение не смотрел? форматы с прошлого века не используют
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.03.2021, 07:50
Цитата Сообщение от Whitecolor Посмотреть сообщение
items2 = []
for i in items1:
    items2.append(Item(i["type"], i["model"], i["cost"]))
Можно использовать ** (т.к. параметры __init__ соответствуют ключам в словаре).
Python
1
2
3
items2 = []
for i in items1:
    items2.append(Item(**i))
1
1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958
25.03.2021, 10:39  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
то есть ты мое решение не смотрел?
Во так можно переделать? Так как я далеко не всё еще знаю как использовать
Python
1
2
for i in range(len(items2)):
    print(f'{i+1}. {items2[i].type.capitalize()} "{items2[i].model}" {items2[i].cost} rub')
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
25.03.2021, 10:46
Whitecolor, ну да можно, если результат устраивает, хотя я лично больше enumerate люблю
0
1198 / 767 / 128
Регистрация: 10.03.2012
Сообщений: 4,958
25.03.2021, 11:29  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
enumerate люблю
Я просто еще не изучил как он работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2021, 11:29
Помогаю со студенческими работами здесь

Как преобразовать список строк в список чисел
Добрый вечер! Есть список 1: sps1= и список 2: Как в списке 2 убрать ' между цифрами?

Преобразовать список в список позиций чётных элементов.
ребят помогите написать задачу в прологе... Задание: Создайте предикат, преобразующий исходный список в список позиций чётных элементов.

Дан список (a b) (b c) (c d) .). Преобразовать его в ассоциативной список
Дан список ((a b) (b c) (c d) ...). Преобразовать его в ассоциативной список. В качестве ключей взять первые элементы вложенных списков. В...

Преобразовать список рёбер в список смежностей
помогите преобразовать список рёбер в список смежностей

Функция: список ‘(a1 a2 a3 …aN) преобразовать в сложный список (aN)…a3) a2) a1)
Написать функцию, которая список ‘(a1 a2 a3 …aN) преобразует в сложный список ((((aN)…a3) a2) a1). Буду благодарен!!!


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru