代码报错'type' object has no attribute '__getitem__'及括号转数组问询
解决你的报错与括号转数组问题
首先,先搞定你遇到的 'type' object has no attribute '__getitem__' 报错——这是因为你写了 set['(()())'],set 是Python的内置类型,创建集合必须用圆括号而非方括号,也就是 set('(()())')。不过看你的需求是要把括号转为数组而非集合/列表,那咱们直接跳过集合,直接生成数组类型就行。
一、括号转数组的两种实现方式
根据你的需求,这里提供两种数组实现方案:
1. 使用Python标准库array(原生数组类型)
import array # 将括号字符串转为Unicode字符数组 brackets_array = array.array('u', '(()())')
2. 使用numpy数组
import numpy as np # 直接将字符串转为numpy字符数组 brackets_np = np.array('(()())', dtype='U1') # 或者先转列表再转数组,效果一致 brackets_np = np.array(list('(()())'), dtype=str)
二、修复代码中的其他问题
你的代码里还有几个语法和逻辑错误,我一起帮你修正:
exp=0|1|0|1是语法错误,|是位运算符,这里应该写成字符串形式exp="0|1|0|1"- Python列表没有
push()方法,要添加元素得用append() evaluate()里的eval用法错误,它只能处理单个表达式字符串,不能直接接收列表push(brackets)逻辑不对,应该把当前遍历到的符号推入栈,而不是整个括号序列
修正后的完整代码示例:
from functools import reduce import array import numpy as np Stack = [] StackSize = 20 arr = [] exp = "0|1|0|1" # 修正为字符串格式 # 把括号转为numpy数组(满足你要数组而非列表的需求) brackets = np.array('(()())', dtype='U1') print(type(brackets)) # 输出<class 'numpy.ndarray'> def push(symbol): if len(Stack) < StackSize: Stack.append(symbol) # 用append替代不存在的push方法 def pop(): if len(Stack) > 0: Stack.pop() evaluate() def evaluate(): # 修正eval的使用方式,逐个计算分段表达式 expressions = [exp[0:x] for x in range(3, len(exp) + 1, 2)] for expr in expressions: print(f"表达式 {expr} 的计算结果:{eval(expr)}") def main(): for symbol in brackets: if symbol == '(': push(symbol) # 推入当前符号而非整个括号序列 elif symbol == ')': pop() if __name__ == '__main__': main()
三、关键说明
- 如果你不想用
numpy,换成标准库的array.array只需要把brackets那行替换成brackets = array.array('u', '(()())'),后续遍历逻辑完全一致。 - 你最初的报错根源是误用了类的调用方式,
set是类必须用set(iterable)创建实例,而你实际需要的是数组,所以直接用数组类型更贴合需求。
内容的提问来源于stack exchange,提问作者Anwesha Patel
相关产品推荐
相关产品推荐

