постфикс к списку бинарных выражений - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в питоне. При запуске этого кода появляется ошибка:

list=[]
list2=[]
list.append("p")
list.append("&")
list.append("k")
print(list)
operator="&" or "|" or">" or "=" or "~"
prop="p" or "q " or "r"
#a=0
for i in list:
     if i == operator:
 #        a = list.index(i)
  #       print(a - 1)
         nextelem = list[list.index(i) + 1]
         prevelem = list[list.index(i) - 1]
         print(nextelem)
         print(prevelem)
         list.remove(i)
         list2.append(i)
     if nextelem==prop:
           print("voici",nextelem)
           list2.append(nextelem)
           list2.append(prevelem)
print(list2)

Указано сообщение об ошибке:

Traceback (последний последний вызов):

Файл "C: /Users/PC/PycharmProjects/LIAATP1/TP01.py", строка 114, в если nextelem == prop: NameError: имя 'nextelem' не определено

например, с формулой: p & q | r

Ожидаемый доход:

[|, &, r, p, q]

[корень, LeftChild, RightChild, leftchildof '&', rightchildof '&']

1 Ответ

0 голосов
/ 13 ноября 2018

Строки оцениваются как True в Python, если они не пусты, поэтому operator здесь имеет значение '&' (так как or вернет первый аргумент, который оценивается как True).Тестирование в командной строке:

operator = "&" or "|" or ">" or "=" or "~"
print(operator)
# '&'

Таким образом, каждый раз, когда вы перебираете list (который вы должны переименовать, поскольку list - зарезервированное слово), вы проверяете, действительно ли i == '&'.Поскольку этого никогда не происходит, код в вашем первом блоке if никогда не выполняется;так как этот код никогда не выполняется, nextelem никогда не устанавливается.

Вот почему вы в конечном итоге получите следующее:

NameError: имя 'nextelem' не определено


Что касается остальной части вашего кода, у логики есть фундаментальные проблемы, которые не позволят ей делать то, что вы ожидаете, даже если вы запустите ее без выдачи исключения.

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


Исключительно ради предоставления примера правильной обработки списка и игнорирования оператора '~' и приоритета оператора ...

input_string = "p & q | r"

values = input_string.split(" ")
print(values)
# ['p', '&', 'q', '|', 'r']

print(values[-2::-2] + values[-1::-2])
# ['|', '&', 'r', 'q', 'p']

values[-1] дает последний элемент в списке.values[-1::-2] возвращает срез массива, начиная с конца и возвращаясь назад на 2 элемента за раз, пока все элементы не будут обработаны.Таким образом, в этом случае это приведет к ['r', 'q', 'p'].

values[-2], затем начнется со второго до последнего элемента в списке.Снова отступая на два, values[-2::-2] возвращает ['|', '&'].Конкатенация этих списков дает результат, который вы ищете, но только в очень определенных обстоятельствах;Решение для общего случая - это то, над чем вам нужно работать, как только вы освоитесь с основами Python (и возвращайтесь к SO, когда у вас есть конкретные вопросы / проблемы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...