Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2022 13:09:17

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

FishHook
RikinДорогой друг, вас очень сложно понять, чего же вы хотите. То-ли непоследовательно изучаете материал, и поэтому у вас задача на ООП, а вы не знаете как выполнить поиск в списке и отсюда всякая терминология вроде “выуживания строк”, то-ли у вас сложности с письменным русским языком и вы не можете корректно сформулировать мысль. Без обид, но я просто не понимаю чего вы хотите получить в итоге. У вас есть задание в том виде, как вам его дал преподаватель?

К заданию в том виде в каком я его получил - у нас, возникли вопросы по его постановке. Я уточнил - было рекомендовано подходить творчески - я его (задание) и дополнил как я вижу постановку задачи на моё усмотрение.
О том что в решении - я вижу выбор (по моим критериям) из предложенного мною же списка - я всё же написал в самом начале… далее я еще привёл пример решения другим учеником: что на входе и чего нужно на выходе (но это не замещало моей постановки задачи выбора из списка), но показывало направление решения в остальном и замечание учителя.

В итоге я хотел бы получить две последние строки (задав их выборку ) из списка vol_datas

{“name”: “Pertov”, “place”: “St. Petersburg”, “status”: ‘Mentor’},
{“name”: “Schwarz”, “place”: “Viena”, “status”: ‘Trainer’}

разумеется с задействием методов наследия - которое Вы столь филигранно уже применили.

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

Замечания Ваши - по делу. Кроме нареканий на мой русской язык.
В условиях недостаточной ясности задачи - она была доформулирована на моё усмотрение (я конкретизировал список волонтёров и предложил критерии выбора из этого списка гостей).

Всё равно большое спасибо за неоценимую помощь.

Офлайн

#2 Янв. 5, 2022 13:41:51

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

py.user.next
Вы верно заметили, мне ( не только) нужно больше времени и упражнений и на переваривание материала по питону, особенно по ООП.
Да, есть темп и мне приходится укладываться в него - из-за чего я пару раз недоработал темы (или усвоил некрепко) и двинулся далее. В результате - пробелы.
И, для меня очевидно, мои знания по питону - на данный момент - недостаточны для применения на рабочем месте. Представьте себе - зовут и не раз, но Вето наложил пока что я сам. Рано еще.

По курсу у меня пока нареканий нет - их дело подать материал (и они хотят побольше дать) и им нужно укладываться в формат - кто-то воспринимает быстрее, кому-то надо больше времени и упражнений… се ля ви.

А после курса - прийдётся по книжке проработать темы/пробелы с бОльшим количеством упражнений по данной тематике.

Офлайн

#3 Янв. 5, 2022 13:47:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

Я всё равно нифига не понял. Я дам вам какое-то решение, сами додумаете, что с этим делать

   
class Person:
    def __init__(self, name: str):
        self.name = name
    def __str__(self):
        return f'{self.name}'
class Volunteer(Person):
    def __init__(self, name: str, city: str, status: str):
        super().__init__(name)
        self.city = city
        self.status = status
    def __str__(self):
        return f'{self.name}, {self.city}, f{self.status}'
volunteer_data = [
        {"name": "Ivanov", "place": "Moscow", "status": 'Consultant'},
        {"name": "Pertov", "place": "St. Petersburg", "status": 'Mentor'},
	    {"name": "Schwarz", "place": "Viena", "status": 'Trainer'}]
volunteeres = [Volunteer(d['name'], d['place'], d['status']) for d in volunteer_data]
guests_names = ['Ivanov', 'Pertov']
guests = [v for v in volunteeres if v.name in guests_names]



Офлайн

#4 Янв. 14, 2022 01:03:56

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

Спасибо большое и с праздниками по старому календарю!

С наследованием - это Вы классно и поучительно сделали: “как доктор прописал”.

При решении новичку хотелось бы сосредотачиваться именно над темой, на которой фокусируется задание (для лучшего усвоения), в данном случае наследование классов.
А в остальных необходимых фрагментах хотелось бы применять наиболее простые решения.
Конечно, надо осваивать “пилотаж относительно повыше”, но не вот бы - постепенно.

Вот я тут ниже пытаюсь склеить решение и даже получаю на выходе кое-что:

 class Person:
    def __init__(self, name: str):
        self.name = name
    def __str__(self):
        return f'{self.name}'
class Volunteer(Person):
    def __init__(self, name: str, place: str, status: str):
        super().__init__(name)                                   
        self.place = place
        self.status = status
    def __str__(self):
        return f'{self.name}, {self.place}, f{self.status}'
volunteer_datas = [
        {"name": "Ivanov", "place": "Moscow", "status": 'Consultant'},
        {"name": "Pertov", "place": "St. Petersburg", "status": 'Mentor'},
	    {"name": "Schwarz", "place": "Viena", "status": 'Trainer'}]
print('list of guests:')
for volunteer_data in volunteer_datas:
    for i in volunteer_data:
        if i == 'name' and volunteer_data['name'] == 'Pertov' or 'Schwarz':
            obj_vol = Volunteer(volunteer_data['name'], volunteer_data['place'], volunteer_data['status'])
            print(obj_vol.__str__())

и получаю на выходе:

 Список гостей :
Ivanov, Moscow, fConsultant
Ivanov, Moscow, fConsultant
Ivanov, Moscow, fConsultant
Pertov, St. Petersburg, fMentor
Pertov, St. Petersburg, fMentor
Pertov, St. Petersburg, fMentor
Schwarz, Viena, fTrainer
Schwarz, Viena, fTrainer
Schwarz, Viena, fTrainer

программа сейчас выдаёт трижды каждого из 3 волонтёров, да еще и почему-то добавляет букву f к статусу fMentor, fTrainer

Я хотел бы получить на выходе данные лишь двух гостей с именем ‘Pertov’ или ‘Schwarz’ однократно (а не трижды каждого) и если можно, без буквы f у статуса…
Прошу подсказки-коррекции кода.

Отредактировано Rikin (Янв. 14, 2022 02:31:34)

Офлайн

#5 Янв. 14, 2022 01:08:29

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

На выходе хотел бы получить:

         {"name": "Pertov", "place": "St. Petersburg", "status": 'Mentor'},
	    {"name": "Schwarz", "place": "Viena", "status": 'Trainer'}]

Офлайн

#6 Янв. 14, 2022 01:27:10

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

Я тут сам пока стараюсь …
а вот если вкинуть скобки после and… а то ведь and доминирует (своей “гравитацией”) над or , то получается уже лучше, во всяком случае ушли многократные повторения одних и тех же гостей,
но их всё еще все трое, а не лишь двое последних из списка ‘Pertov’ или ‘Schwarz’ и всё еще буква f у статуса не ушла…

 class Person:
    def __init__(self, name: str):
        self.name = name
    def __str__(self):
        return f'{self.name}'
class Volunteer(Person):
    def __init__(self, name: str, place: str, status: str):
        super().__init__(name)                                   
        self.place = place
        self.status = status
    def __str__(self):
        return f'{self.name}, {self.place}, f{self.status}'
volunteer_datas = [
        {"name": "Ivanov", "place": "Moscow", "status": 'Consultant'},
        {"name": "Pertov", "place": "St. Petersburg", "status": 'Mentor'},
	    {"name": "Schwarz", "place": "Viena", "status": 'Trainer'}]
print('Список гостей :')
for volunteer_data in volunteer_datas:
    for i in volunteer_data:
        if i == 'name' and (volunteer_data['name'] == 'Pertov' or 'Schwarz'):
            obj_vol = Volunteer(volunteer_data['name'], volunteer_data['place'], volunteer_data['status'])
            print(obj_vol.__str__())

На выходе имеем на текущий момент:

 Список гостей :
Ivanov, Moscow, fConsultant
Pertov, St. Petersburg, fMentor
Schwarz, Viena, fTrainer

Отредактировано Rikin (Янв. 14, 2022 02:33:03)

Офлайн

#7 Янв. 14, 2022 01:33:24

Rikin
Зарегистрирован: 2020-11-14
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

а вот и букву f у статуса убрали - там выше в строке с return - опечатка была, очевидно…
Но всё еще лишний Ivanov на выходе

Офлайн

#8 Янв. 14, 2022 11:27:45

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

Выбрать нескольких гостей из списка. Задействуя наследование

Rikin
Я хотел бы получить на выходе данные лишь двух гостей с именем ‘Pertov’ или ‘Schwarz’ однократно (а не трижды каждого) и если можно, без буквы f у статуса…
Прошу подсказки-коррекции кода.
Rikin
На выходе хотел бы получить:


{“name”: “Pertov”, “place”: “St. Petersburg”, “status”: ‘Mentor’},
{“name”: “Schwarz”, “place”: “Viena”, “status”: ‘Trainer’}]

 volunteer_datas = [
        {"name": "Ivanov", "place": "Moscow", "status": 'Consultant'},
        {"name": "Pertov", "place": "St. Petersburg", "status": 'Mentor'},
	    {"name": "Schwarz", "place": "Viena", "status": 'Trainer'}]
for  i in list(filter(lambda d: d['name'] in ("Pertov", "Schwarz"), volunteer_datas)):
    print(i)

вывод
{'name': 'Pertov', 'place': 'St. Petersburg', 'status': 'Mentor'}
{'name': 'Schwarz', 'place': 'Viena', 'status': 'Trainer'}

Зачем тут вообще ООП, если вам нужны данные из словаря?

Отредактировано xam1816 (Янв. 14, 2022 11:36:10)

Офлайн

#9 Янв. 14, 2022 11:48:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Выбрать нескольких гостей из списка. Задействуя наследование

xam1816
зачем вы постоянно используете map и filter? Это уже давно устаревшие и нерекомендуемые функции, они отнюдь не добавляют вашему коду ни читабельности ни перформанса. Зачем вы кастуете генератор к списку и тут же его итерируете?

 for i in volunteer_datas:
    if i['name'] in ("Pertov", "Schwarz"):
        print(i)

или

 for i in (i for i in volunteer_datas if i['name'] in ("Pertov", "Schwarz")):
    print(i)

и всё, не надо ни лямбды, ни фильтра, ни к списку приводить. У вас миллион каких-то ненужных вызовов постоянно, не только в этом примере



Офлайн

#10 Янв. 14, 2022 12:14:16

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

Выбрать нескольких гостей из списка. Задействуя наследование

FishHook
Зачем вы кастуете генератор к списку и тут же его итерируете?
да есть такое, сначала у себя вывел так
 print(list(filter(lambda d: d['name'] in ("Pertov", "Schwarz"), volunteer_datas)))
потом решил построчно вывести, и на автомате скопировал строку от list до конца
а фильтрами и мапами пользуюсь, потому что тут на форуме увидел что ими пользуются и тоже стал пользоваться чаще, чтобы запомнить как они работают.
но раз говорите
FishHook
Это уже давно устаревшие и нерекомендуемые функции
то учту этот момент

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version