我是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中评估为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)。