Лучший способ создать функцию, которая вызывает саму себя

#python #python-3.x

#python #python-3.x

Вопрос:

Каков наилучший способ создать функцию, которая вызывает себя на основе условия? Например, у меня есть словарная переменная, скажем, «таблица», которая содержит текстовые (значения) метаданные (ключ), и другая переменная, которая содержит текст сравнения, скажем, «строка». Мне нужно написать программу, которая будет брать данные из строки и сопоставлять их со значениями «таблицы». Если совпадение будет успешным, то оно должно вывести «table-key line», иначе оно удалит последнее слово из «line» и выполнит ту же операцию. Пример табличной переменной и линейной переменной приведен ниже :

Табличная переменная :

 {'[Base Font : IOHLGA Trebuchet, Font Size : 3.768, Font Weight : 0.0]': 'Additions based on tax 
positions related to the They believe that it is reasonably possible that approximately $40 million of 
its unrecognized tax benefits may be recognized by the end of 2019 as a result of a lapse of the statute 
of limitations or resolution with the tax authorities.', [Base Font : IOFOEO Imago-Book, Font Size : 6.84, 
Font Weight : 0.0]': 'Additions based on tax positions related to prior'}
  

Переменная строки :

 Additions based on tax positions related to the Additions based on tax positions related to prior Bunge 
believes that it is reasonably possible that approximately $40 million of its unrecognized tax benefits 
may be recognized by the end of 2019 as a result of a lapse of the statute of limitations or resolution 
with the tax authorities.
  

Моя логика: эта логика не дает ожидаемого результата

 with open("myfile1.txt","r", encoding='utf-8') as f, open("myfile2.txt","w") as f1:
for line in f:
    if line.strip():
        words = " ".join(line.split())
        for i in table:
            if words in table[i]:
                f1.write(i line)
                break
            else:
                pass
        else:
            line_split = line.split()
            remaining_itemlist = []
            while len(line_split)>0:
                for i in table:
                    words = " ".join(line_split[:len(line_split)])
                    if words in table[i]:
                        f1.write(i words)
                        new_word = words.split()
                        for i in range(len(new_word)):
                            line_split.pop(0)
                        for i in table:
                            if " ".join(remaining_itemlist) in table[i]:
                                f1.write(i " ".join(remaining_itemlist))
                                break
                        break
                    else:
                        pass
                else:
                    remaining_itemlist.insert(0, line_split.pop(-1))
    else:
        f1.write(line)
  

Мой вывод :

 [Base Font : IOHLGA Trebuchet, Font Size : 3.768, Font Weight : 0.0]Additions based on tax positions 
related to the Additions based on tax positions related to prior They believe that it is reasonably 
possible that approximately $40 million of its unrecognized tax benefits may be recognized by the end of 
2019 as a result of a lapse of the statute of limitations or resolution with the tax authorities.
  

Ожидаемый результат :

 [Base Font : IOHLGA Trebuchet, Font Size : 3.768, Font Weight : 0.0]Additions based on tax positions 
related to the [Base Font : IOFOEO Imago-Book, Font Size : 6.84, Font Weight : 0.0]Additions based on tax 
positions related to prior [Base Font : IOHLGA Trebuchet, Font Size : 3.768, Font Weight : 0.0]They believe that it 
is reasonably possible that approximately $40 million of its unrecognized tax benefits may be recognized 
by the end of 2019 as a result of a lapse of the statute of limitations or resolution with the tax authorities.
  

Комментарии:

1. Можете ли вы уточнить, что именно вы спрашиваете? «Функция, которая вызывает саму себя» (обычно называемая «рекурсивной функцией») буквально просто делает это, то есть вызывает саму себя. Это просто def name(...): name(...) . На самом деле нет никаких вариаций этого, поэтому нет «лучшего способа», только один очевидный. Какие варианты, по вашему мнению, могут иметь «лучшее» решение и каковы ваши критерии «лучшего»?

2. Я использовал лучший способ в контексте данного примера. Я не смог рекурсивно вызвать функцию для генерации ожидаемого результата. Я почти уверен, что единственное изменение, необходимое в данном коде, — это рекурсивный вызов функции. Однако, поскольку я новичок в программировании, я не уверен. Я вызвал функцию, как вы упомянули, но все же я далек от ожидаемого результата. Есть ли какое-либо другое возможное решение для получения ожидаемого результата?

3. Показанный код представляет собой слегка искаженный набор инструкций. Можете ли вы уточнить, какую часть вы собираетесь превратить в рекурсивную функцию?

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

Ответ №1:

Я написал несколько простых кодов, которые можно заменить вашими с необходимыми изменениями

 line='there is some line which is needed to be checked'

your_dict = {'key1':'there is some line','key2':'it is not','key3':'not even this'}

def check_the_match(line):
    flag=0
    for k in your_dict.keys():
        if line in your_dict[k]:
            flag=1
            print(k line)
        
    if flag==0:
        print('Checking again')
        new_line = " ".join(line.split()[:-1])
        check_the_match(new_line)

check_the_match(line) 

 
  

Я получил следующий вывод:

 Checking again
Checking again
Checking again
Checking again
Checking again
Checking again
key1there is some line
  

Комментарии:

1. Привет @Abhinav, в вашем коде также есть некоторые недостатки, и мне этого недостаточно. Можете ли вы изменить свой ввод или просто использовать мой, а затем попробовать свой код. Однако ваш код дает мне представление о том, как вызывать функцию из самой себя.

2. Я создал ее просто для того, чтобы дать представление :).. Вот почему я написал «необходимые изменения»

3. Согласитесь, я внес в нее некоторые изменения. Это не помогло. Проблема в том, что из-за сложностей мой код стал таким длинным. Вот почему я обращаюсь за помощью здесь.

Ответ №2:

Я добавляю еще один фрагмент кода: пожалуйста, убедитесь, что вы увеличили предел рекурсии, поскольку python имеет низкий предел рекурсии. Вы можете использовать библиотеку sys для игры с ограничением рекурсии, я сделал это на основе моего понимания проблемы, извиняюсь за любую ошибку

 import sys
sys.setrecursionlimit(1000)

dictionary={
                '[Base Font : IOHLGA Trebuchet, Font Size : 3.768, Font Weight : 0.0]': 'Additions based on tax positions related to the They believe that it is reasonably possible that approximately $40 million of its unrecognized tax benefits may be recognized by the end of 2019 as a result of a lapse of the statute of limitations or resolution with the tax authorities.',
                '[Base Font : IOFOEO Imago-Book, Font Size : 6.84, Font Weight : 0.0]': 'Additions based on tax positions related to prior'
            }


line ='Additions based on tax positions related to the Additions based on tax positions related to prior Bunge believes that it is reasonably possible that approximately $40 million of its unrecognized tax benefits may be recognized by the end of 2019 as a result of a lapse of the statute of limitations or resolution with the tax authorities.'


                           
def check_the_match(line):
    
    for k in dictionary.keys():
        if line in dictionary[k]:
            print(k dictionary[k])
     
    # trimming the line
    new_line = " ".join(line.split(' ')[:-1])
    
    
    if len(new_line.split(' ')[:-1])>1:
        
        check_the_match(new_line)

        
check_the_match(line)