Как я могу исправить эту функцию отображения списка? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать функцию python, которая принимает строку формулы Excel и изменяет ее на псевдо-читаемый текст, и наоборот в соответствии с этим отображением.

mapping = {"'2020 Projects'!$I3" : "end_date",
"'2020 Projects'!$H3" : "start_date",
"'2020 Projects'!$L3" : "perc_baa",
"'2020 Projects'!$G3" : "prob",
"'2020 Projects'!$J3" : "monthly_rev",
"43951": "april_30_number",
"43922": "april_1_number",
"43952": "may_1_number",}

Прямо сейчас у меня есть это и получаю неправильные результаты.

def code_to_ex(s):
    excel = s
    for word, code in mapping.items():
        excel = s.replace(code, word)
        print(excel)

def ex_to_code(s):
    code = s
    for word, code in mapping.items():
        code = s.replace(code, word)
        print(code)

Вот пример ввода и вывода:

String ="IF('2020 Projects'!$H3>43922,yes,no)"

ex_to_code(String)
answer -> IF(start_date>apr1, yes no)

String2 = 'IF(start_date>apr30, no, yes)'
code_to_ex(String2)
answer -> 'IF(2020 Projects'!$H3>43951,no,yes)'

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

переменная excel обновляется каждый раз.

Итак, вам следует изменить свою функцию следующим образом.

def code_to_ex(s):
    for word, code in mapping.items():
        s = s.replace(code, word)
    print(s)

def ex_to_code(s):
    for word, code in mapping.items():
        s = s.replace(code, word)
    print(s)
0 голосов
/ 07 апреля 2020

Есть несколько проблем с вашим кодом. Я надеюсь, что ничего не пропущу, но дайте мне знать, если что-то неясно:

mapping = {"'2020 Projects'!$I3" : "end_date",
"'2020 Projects'!$H3" : "start_date",
"'2020 Projects'!$L3" : "perc_baa",
"'2020 Projects'!$G3" : "prob",
"'2020 Projects'!$J3" : "monthly_rev",
"43951": "april_30_number",
"43922": "april_1_number",
"43952": "may_1_number",}

def code_to_ex(s):
    excel = s
    for word, code in mapping.items():
        # not excel = s.replace, since you want to continuously update excel
        excel = excel.replace(code, word)
    print(excel)

def ex_to_code(s):
    # renamed code to all_code, since you are iterating over mapping.items() with code
    all_code = s
    for word, code in mapping.items():
        # same issue as above
        all_code = all_code.replace(word, code)
    print(all_code)

String1 = "IF('2020 Projects'!$H3>43922,yes,no)"
String2 = 'IF(start_date>april_30_number, no, yes)'

ex_to_code(String1)
code_to_ex(String2)

Вывод:

IF(start_date>april_1_number,yes,no)
IF('2020 Projects'!$H3>43951, no, yes)

Слово предупреждения, так как этот метод немного наивен : вы можете быть отключены, если code является подстрокой word или наоборот, поскольку сопоставление может выполняться дважды: например, для правил {'AB': 'C', 'C': 'D'}, строка AB может отображаться на D.

...