#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)