Форум сайта python.su
Нужна помощь ребята! Окончательно запутался! И уже не знаю как выполнитб это задание
Моя задача:
Блоги вашей компании. Вам нужно реализовать функцию find_articles для поиска статей в этом блоге. Есть список article_dict, который содержит описание статей блога. Каждый элемент этого списка представляет собой словарь со следующими ключами:
фамилии авторов - ключ ‘автор’
название статьи - ключ ‘title’
год издания - ключ ‘год’.
Реализуйте функцию find_articles,
Ключевой параметр функции определяет комбинацию букв для поиска. Например, с ключом = “Python” функция проверяет, есть ли статьи в списке article_dict с этой комбинацией букв в названии или именах авторов. Если такие элементы списка были найдены, должен быть возвращен новый список из словарей, содержащий фамилии авторов, название и год публикации всех таких статей.
Второй ключевой параметр функции letter_case определяет, должен ли поиск учитывать регистр. По умолчанию стоит False и регистр не имеет значения, то есть поиск в тексте «Python» и «python» одинаков. В противном случае нужно искать полное совпадение.
Мой код:
articles_dict = [ { "title": "Endless ocean waters.", "author": "Jhon Stark", "year": 2019, }, { "title": "Oceans of other planets are full of silver", "author": "Artur Clark", "year": 2020, }, { "title": "An ocean that cannot be crossed.", "author": "Silver Name", "year": 2021, }, { "title": "The ocean that you love.", "author": "Golden Gun", "year": 2021, }, ] # print(articles_dict[0]["title"]) def find_articles(key, letter_case=False): print(key) lst = [] while True: for l in articles_dict: if key in l['title'] or key in l['author'] or key in ['year']: for k, v in l.items(): if key in v.lower(): lst.append(f'{k} {v}\n') # result = "".join(lst) #re.search(result, key, flags=re.IGNORECASE) return lst return letter_case
Отредактировано Alduin (Янв. 10, 2023 18:15:52)
Офлайн
Ошибка которую получаю
Функция find_articles возвращает неверный результат: []. Должно быть find_articles('Ocean') == [{'title': 'Endless ocean waters.', 'author': 'Jhon Stark', 'year': 2019}, {'title': 'Oceans of other planets are full of silver', 'author': 'Artur Clark', 'year': 2020}, 'title': 'An ocean that cannot be crossed.', 'author': 'Silver Name', 'year': 2021 }, {'title': 'The ocean that you love.', 'author': 'Golden Gun', 'year': 2021}]
Отредактировано Alduin (Янв. 10, 2023 18:46:23)
Офлайн
def search(request, date, letter_case=False): result = [] for i in date: i = i.values() try: if letter_case: str(i).index(request) result.append(i) else: str(i).lower().index(request.lower()) result.append(i) except ValueError as err: if err == 'substring not found': pass return result if len(result) else None
Отредактировано AD0DE412 (Янв. 11, 2023 01:26:17)
Офлайн
Спасибо ВАм за код но к сожалению он не подходи под выполнения условии моего задания
Офлайн
end_ = [{j: e for j, e in zip(["title", "author", "year"], i)} for i in search('An', articles_dict, 1)] print(end_)
[{'title': 'An ocean that cannot be crossed.', 'author': 'Silver Name', 'year': 2021}]
end_ = [{j: e for j, e in zip(["title", "author", "year"], i)} for i in search('An', articles_dict, 0)]
[{'title': 'Endless ocean waters.', 'author': 'Jhon Stark', 'year': 2019}, {'title': 'Oceans of otherplanets are full of silver', 'author': 'Artur Clark', 'year': 2020}, {'title': 'An ocean that cannot be crossed.', 'author': 'Silver Name', 'year': 2021}, {'title': 'The ocean that you love.', 'author': 'Golden Gun', 'year': 2021}]
Отредактировано AD0DE412 (Янв. 10, 2023 21:11:03)
Офлайн
def find_articles(key, letter_case=False): out = [] for d in articles_dict: # берем словарь из списка for k, v in d.items(): # получаем пару ключ, значение из словаря if k in ['title', 'author']: # если ключ соответствует условию search = key in v if letter_case else key.lower() in v.lower() #поиск = подстрока в строке ? если аргумент==истина иначе подстрока.нижний_регистр в строке.нижний регистр ? if search: # если поиск ==истина out.append(d) # добавить в список словарь return out # вернуть список
Отредактировано xam1816 (Янв. 11, 2023 00:03:13)
Офлайн
articles_dict = [ { "title": "Endless ocean waters.", "author": "Jhon Stark", "year": 2019, }, { "title": "Oceans of other planets are full of silver", "author": "Artur Clark", "year": 2020, }, { "title": "An ocean that cannot be crossed.", "author": "Silver Name", "year": 2021, }, { "title": "The ocean that you love.", "author": "Golden Gun", "year": 2021, }, ] def search(request, letter_case=False): result = [] for i in articles_dict: val = list(i.values())[:2] try: if letter_case: str(val).index(request) else: str(val).lower().index(request.lower()) except ValueError: continue result.append(i) return result if len(result) else None print(search('шо не так то?', 1)) # -> None
Отредактировано AD0DE412 (Янв. 11, 2023 01:32:39)
Офлайн
AlduinПодавай список статей в функцию. Не нужно делать так, чтобы функция искала где-то там снаружи список статей.
Прежде всего, скажите, на ваш взгляд, верна ли моя логика в построении алгоритма кода для достижения этой задачи?
def find_articles(articles, key, letter_case=False):
AlduinПрямо там, где проверяешь вхождение искомой строки в строку. Можешь эту проверку сделать в виде if … else … и необязательно в одну строку. Главное в коде, чтобы он был ясным и чтобы он правильно работал. А одна строка это или это четыре строки - абсолютно не важно.
Во-вторых, не подскажете, где использовать letter_case?
if letter_case: делаем одно else: делаем другое
AlduinТолько один цикл for нужен на всё про всё.
Я думаю, что цикл while нужен, но где его писать?
AlduinОперация in используется.
В-третьих, я знаю, что основными методами поиска подстроки в строке являются строки, поэтому я сделал здесь строку, но как мне проверить, есть ли, например, ключ = “Python” в заданной строке в задаче . И так я понял, что надо учитывать случай, подозреваю, что надо использовать .lower() и .upper().
>>> 'abc' in 'abc abc abc' True >>> 'Abc' in 'abc abc abc' False >>> 'Abc'.lower() in 'abc abc abc' True >>> >>> 'abc' in 'Abc Abc Abc' False >>> 'abc' in 'Abc Abc Abc'.lower() True >>> 'abc'.lower() in 'Abc Abc Abc'.lower() True >>> >>> 'ABC'.lower() in 'Abc Abc Abc'.lower() True >>>
AlduinТебе из исходного списка статей надо выбрать подходящие статьи. То есть тебе нужно из одного списка объектов взять адресы этих объектов и занести их в другой список. Объекты будут оставаться одними и теми же в двух разных списках.
В-четвертых, не усложняю ли я опять все? После того, как я проверю, есть ли в этом тексте ключ = “Python” или что-то еще, правильно ли мне конвертировать потом из строки в список, а потом в словарь? Должен ли я сначала использовать метод split() или list(), а затем dict()?
>>> lst1 = [[1, 2], [3, 4], [5, 6]] >>> >>> lst1 [[1, 2], [3, 4], [5, 6]] >>> >>> lst2 = [lst1[0], lst1[2]] >>> >>> lst2 [[1, 2], [5, 6]] >>> >>> lst2[0][1] *= 10 >>> >>> lst2 [[1, 20], [5, 6]] >>> >>> lst1 [[1, 20], [3, 4], [5, 6]] >>>
Отредактировано py.user.next (Янв. 11, 2023 02:52:42)
Офлайн