我试图使用pop与列表,但它给了我以下错误
AttributeError: 'str' object has no attribute 'pop'
Run Code Online (Sandbox Code Playgroud)
我使用pop的方式是:
vertex = my_queue.pop()
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,当我使用print(顶点)时,它打印出数据,这意味着它工作正常,但同时显示错误令人困惑.
我的代码:
def bfs(my_data):
my_queue = [] #array to store vertices
#print(my_data[0])
my_queue.insert(0, my_data[0]);
my_data[0]['visited'] = '1';
int_vertex = []
while my_queue:
vertex = my_queue.pop()
for n_vertex in vertex['neighbors']:
#print(type(n_vertex))
int_vertex = int(n_vertex)
if my_data[int_vertex]['visited'] == '0':
my_data[int_vertex]['visited'] = '1'
test.insert(0, my_data[int_vertex])
my_queue = str(test)
Run Code Online (Sandbox Code Playgroud)
my_queue和my_data是列表,顶点是dict
看看这两行:
vertex = my_queue.pop()
# ...
my_queue = str(test)
Run Code Online (Sandbox Code Playgroud)
因此,在第一次通过循环后,my_queue显然是一个str,因为你明确地将它转换为一个.
您可以看到字符串方法和通用序列操作的列表.请注意,pop那里没有出现.这是因为pop只有一个方法可变的序列类型一样list.这正是这个错误告诉你的:
AttributeError: 'str' object has no attribute 'pop'
Run Code Online (Sandbox Code Playgroud)
即使有这样的方法,你会期望它返回什么?字符串的第一个字符?如何使用for n_vertex in vertex['neighbors'],显然希望vertex是dict(或其他Mapping类型),而不是单字符字符串?
我不确定你到底想要做什么,但我怀疑取消这个str()电话本身并不足以解决你所有的问题.您将附加到名称中的列表,该列表test未在函数中的任何位置定义,因此可能是全局变量.然后扔掉任何内容,my_queue而不是将其分配给该全局变量.那可能不是你想要的.我的猜测 - 但这只是一个猜测 - 你要用这个代替最后两行:
my_queue.insert(0, my_data[int_vertex])
Run Code Online (Sandbox Code Playgroud)