我是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)
指定的错误消息:
回溯(最近通话最近一次):
文件“ C:/Users/PC/PycharmProjects/LIAATP1/TP01.py”,第114行,在 如果nextelem == prop: NameError:名称“ nextelem”未定义
例如,使用公式:p & q | r
预期收益:
[|,&,r,p,q]
[root,leftchild,rightchild,'&'的leftchild,'&'的rightchild]
答案 0 :(得分:0)
除非在字符串中为空,否则字符串在Python中的计算结果为True,因此operator
的值为'&'
(因为or
将向其返回第一个参数,其结果为{{1 }})。在命令行上对其进行测试:
True
因此,每次循环operator = "&" or "|" or ">" or "=" or "~"
print(operator)
# '&'
时(您应该重命名,因为list
是保留字),请检查是否list
。由于永远不会执行,因此永远不会执行第一个i == '&'
块中的代码;由于从未执行过该代码,因此永远不会设置if
。
为什么会这样呢?
NameError:未定义名称'nextelem'
关于代码的其余部分,该逻辑具有一些基本问题,即使您在不引发异常的情况下运行它,也将阻止其执行预期的工作。
在尝试重写它之前,我强烈建议您通过the official Python tutorial来深入了解实现该算法所需的数据和控制结构。
仅是为了提供有效列表处理的示例,而忽略nextelem
运算符和运算符优先级...
'~'
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]
返回一个数组切片,该数组切片从末尾开始,一次向后退2个元素,直到处理完所有元素。因此,在这种情况下,这将导致values[-1::-2]
。
['r', 'q', 'p']
然后从列表的倒数第二个元素开始。 values[-2]
再退一步,返回values[-2::-2]
。串联这些列表可以为您提供所需的结果,尽管仅在非常特殊的情况下;一个通用的解决方案是您在熟悉了Python基础之后就需要进行的工作(当您遇到特定的问题/问题时,请回到SO。)。