Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2023 18:15:24

Alduin
Зарегистрирован: 2023-01-10
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

Нужна помощь ребята! Окончательно запутался! И уже не знаю как выполнитб это задание
Моя задача:

Блоги вашей компании. Вам нужно реализовать функцию 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
Прежде всего, скажите, на ваш взгляд, верна ли моя логика в построении алгоритма кода для достижения этой задачи?

Во-вторых, не подскажете, где использовать letter_case? Я думаю, что цикл while нужен, но где его писать?

В-третьих, я знаю, что основными методами поиска подстроки в строке являются строки, поэтому я сделал здесь строку, но как мне проверить, есть ли, например, ключ = “Python” в заданной строке в задаче . И так я понял, что надо учитывать случай, подозреваю, что надо использовать .lower() и .upper().

В-четвертых, не усложняю ли я опять все? После того, как я проверю, есть ли в этом тексте ключ = “Python” или что-то еще, правильно ли мне конвертировать потом из строки в список, а потом в словарь? Должен ли я сначала использовать метод split() или list(), а затем dict()?

Спасибо! Можете ли вы исправить мою логику и указать мне правильное направление!

Отредактировано Alduin (Янв. 10, 2023 18:15:52)

Офлайн

#2 Янв. 10, 2023 18:44:23

Alduin
Зарегистрирован: 2023-01-10
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

Ошибка которую получаю

 Функция 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)

Офлайн

#3 Янв. 10, 2023 20:15:36

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

 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



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Янв. 11, 2023 01:26:17)

Офлайн

#4 Янв. 10, 2023 20:42:07

Alduin
Зарегистрирован: 2023-01-10
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

Спасибо ВАм за код но к сожалению он не подходи под выполнения условии моего задания

Офлайн

#5 Янв. 10, 2023 21:01:34

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

 end_ = [{j: e for j, e in zip(["title", "author", "year"], i)} for i in search('An', articles_dict, 1)]
print(end_)
upd
 [{'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}]



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Янв. 10, 2023 21:11:03)

Офлайн

#6 Янв. 10, 2023 23:51:17

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

реализовать функцию find_articles для поиска по статьям этого блога

  
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)

Офлайн

#7 Янв. 11, 2023 01:26:52

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

 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



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Янв. 11, 2023 01:32:39)

Офлайн

#8 Янв. 11, 2023 02:50:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

реализовать функцию find_articles для поиска по статьям этого блога

Alduin
Прежде всего, скажите, на ваш взгляд, верна ли моя логика в построении алгоритма кода для достижения этой задачи?
Подавай список статей в функцию. Не нужно делать так, чтобы функция искала где-то там снаружи список статей.

Вот такая сигнатура у функции должна быть
  
def find_articles(articles, key, letter_case=False):

Alduin
Во-вторых, не подскажете, где использовать letter_case?
Прямо там, где проверяешь вхождение искомой строки в строку. Можешь эту проверку сделать в виде if … else … и необязательно в одну строку. Главное в коде, чтобы он был ясным и чтобы он правильно работал. А одна строка это или это четыре строки - абсолютно не важно.

  
if letter_case:
    делаем одно
else:
    делаем другое

Alduin
Я думаю, что цикл while нужен, но где его писать?
Только один цикл for нужен на всё про всё.

Alduin
В-третьих, я знаю, что основными методами поиска подстроки в строке являются строки, поэтому я сделал здесь строку, но как мне проверить, есть ли, например, ключ = “Python” в заданной строке в задаче . И так я понял, что надо учитывать случай, подозреваю, что надо использовать .lower() и .upper().
Операция in используется.
  
>>> '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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version