Как создать переменную экземпляра и использовать внутри класса? - PullRequest
0 голосов
/ 11 сентября 2018

Как создать переменную экземпляра из списка ниже, который содержит ключ словаря с именем price, и я пытаюсь получить прайс-лист всех книг, используя класс с именем Library

1) Вот списоккниг и их подробностей

data = { "books" : [ { "number_of_pages" : 849,
        "price" : 13.550000000000001,
        "publish_date" : 2011,
        "subjects" : [ "Time travel",
            "Assassination"
          ],
        "title" : "11/22/63"
      },
      { "number_of_pages" : 732,
        "price" : 7.9900000000000002,
        "publish_date" : 1999,
        "subjects" : [ "Authors",
            "Custody of children",
            "Grandfathers",
            "Haunted houses",
            "Novelists",
            "Trials (Custody of children)",
            "Widowers",
            "Widows",
            "Writer's block"
          ],
        "title" : "Bag of bones"
      },]}

2) Я создал класс с именем Library, который распакует список и сохранит переменные

class Library:
    def __init__(self,**kwargs):

        for k, v in kwargs.items():
            setattr(self, k, v)
            #print(k,v)
        if 'price' in v[0:][1]:
              for c in v[0:][1].items():
                  if 'price' in c:
                    self.price=c['price']


    def price_book(self):
         return self.price

    def __float__(self):
        return self.price


Libra = Library(**data)
Price=Libra.price_book()
print(Price)

. При попытке возврата с использованием экземпляров его перенастройкаошибка установки переменной для цены?

Как установить переменную экземпляра и получить список цен в библиотеке?

С уважением

Обновление 1:

self.price = c ['price']

TypeError: индексы кортежа должны быть целыми или кусочками, а не str

Обновление2:

class Library:
    def __init__(self,**kwargs):

        for k, v in kwargs.items():
                setattr(self, k, v)

        self.price = []
        for k, v in kwargs.items():
            for i in range(len(v)):
                self.price.append(v[i]['price'])

    def price_book(self):
         return self.price

    def discount_book(self):
         self.price=self.price
         return  list(map((lambda x: x -2), self.price))

    def __float__(self):
        return self.price

Libra = Library(**data)
Price=Libra.price_book()
Pri=Libra.discount_book()
print(Price)
print(Pri)

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Просто не удается увидеть, где вы повесили трубку, извлекает ли она цены или устанавливает их для экземпляра.

def __init__(self, **kwargs):

    for k, v in kwarg.items():
        setattr(self, k, v)

    self.price = []
    for k, v in kwargs.items():
        for i in range(len(v)):
            self.price.append(v[i]['price'])
(xenial)vash@localhost:~/python/AtBS$ python3.7 comphren.py 
[13.55, 7.99]

Предложение по запросу

Одна вещь, которую я бы не сделал, потому что я не уверен, я думаю, что использование data создает ненужное вложение, если только у вас не будет books и вы не скажете movies в противном случае выможно просто назвать все это books и удалить один уровень вложенности.Также этот метод регистрирует дубликаты, которые я обходил, используя set, но вы могли избежать добавления дубликатов с большим количеством кода, не хотел делать слишком много, потому что все еще не был уверен во всей задаче.

Но если цель былапросто для создания этих списков каждого фрагмента данных этот код будет работать:

pages = []
publish_dates = []
subjects = []
titles = []
prices = []

for v in data.values():
    for i in range(len(v)):
       for w, x in v[i].items():
            pages.append(v[i]['number_of_pages'])
            publish_dates.append(v[i]['publish_date'])
            titles.append(v[i]['title'])
            prices.append(v[i]['price'])
            for a in v[i]['subjects']:
                subjects.append(a)

print(f"Pages: {set(pages)}\nPublish Dates: {set(publish_dates)}\n" \
      f"Subjects: {set(subjects)}\nTitles:{set(titles)}\n" \
      f"Prices: {set(prices)}")

Вывод

(xenial)vash@localhost:~/python/AtBS$ python3.7 comphren.py 
Pages: {849, 732}
Publish Dates: {2011, 1999}
Subjects: {'Time travel', 'Widows', 'Authors', 'Widowers',
'Assassination', 'Haunted houses', 'Grandfathers', "Writer's block",
'Novelists', 'Trials (Custody of children)', 'Custody of children'}
Titles:{'11/22/63', 'Bag of bones'}
Prices: {13.55, 7.99}
0 голосов
/ 11 сентября 2018
if 'price' in v[0:][1]:
    for c in v[0:][1].items():
        if 'price' in c:
            self.price=c['price']

Метод словаря items() возвращает пары ключ-значение в виде кортежей.

Следовательно, c - это кортеж, например ('price', 7.99).

Индексированные кортежицелыми числами, а не строками.

Вы, вероятно, хотите вместо self.price = c[1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...