postfix到binaryExpression列表

问题描述 投票:0回答:1

我是python的新手。运行此代码时出现错误:

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:name'nextelem'未定义

例如,使用公式:p & q | r

预期收益:

[|,&,R,P,Q]

[根,leftchild,rightchild,leftchildof '&',rightchildof '和']

python list
1个回答
0
投票

字符串在Python中评估为True,除非它们是空的,所以operator这里的值为'&'(因为or将返回第一个参数为True)。在命令行上测试它:

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

因此,每次你循环list(你应该重命名,因为list是一个保留字),你检查是否i == '&'。因为它永远不会,你的第一个if块中的代码永远不会被执行;由于该代码永远不会执行,因此永远不会设置nextelem

这就是为什么你最终得到这个:

NameError:未定义名称“nextelem”


关于代码的其余部分,逻辑具有基本问题,即使您在不抛出异常的情况下运行它,也会阻止它执行您期望的操作。

在您尝试重写之前,我强烈建议您通过the official Python tutorial深入了解实现该算法所需的数据和控制结构。


仅仅是为了提供有效列表处理的示例,并忽略'~'运算符和运算符优先级...

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

© www.soinside.com 2019 - 2024. All rights reserved.