我正在尝试做类似Python下面的代码
PHP代码:
if(!$my_data[$n_vertex]['visited']){
$my_data[$n_vertex-1]['visited'] = true;
}
我在 Python
中正在做的事情def bfs(my_data):
my_queue = [] #array to store vertices
my_queue.insert(0, my_data[0]); #pass the first value to the first index of queue
my_data[0]['visited'] = 'true';
while my_queue:
vertex = my_queue.pop()
for n_vertex in vertex['neighbors']:
#print(n_vertex)
if my_data[n_vertex]['visited']:
continue
else:
my_data[n_vertex]['visited'] = 'true'
my_queue.insert(0, my_data[n_vertex]);
我收到以下错误:
File "/Users/osamayawar/Desktop/Python/BFS.py", line 30, in bfs
if my_data[n_vertex]['visited']:
TypeError: list indices must be integers, not str
列表索引的确切含义必须是整数。
注意: bfs是我的函数名称
答案 0 :(得分:1)
在Python中,列表索引始终是整数。您可以使用索引访问该项目:
l = ['a', 1, 2]
print l[0] ## 'a'
print l[1] ## 1
您可能想要的是dict
:
d = {'vertex': 120}
print d['vertex'] #120
答案 1 :(得分:1)
Python列表索引必须是整数。 PHP使用键值对来访问数组中的项目,并且可能有重复项。例如:
$array= array( "name" => "Bill", "job" => "programmer",
0 => "Bill",
1 => "programmer");
PHP数组与Python字典更相似。见Python standard library docs on dictionaries
查看您正在使用的数据会很有帮助。 (my_data
)
如果您的数据结构与此类似,这是一个字典列表,它可以工作:
my_data=[{"visited":False, "some_other_key":"string-value"},
{"visited":True, "some_other_key":"string-value"}
]
您可能需要重新编写您的python代码,使其更加“pythonic”。
if not my_data[n_vertex]['visited']:
my_data[n_vertex]['visited'] = True
my_queue.insert(0, my_data[n_vertex])
答案 2 :(得分:0)
您正在尝试将字符串作为列表索引传递:
my_data[n_vertex]['visited']
'visit'不是数字。
请问您的my_data声明吗?
答案 3 :(得分:0)
在堆栈跟踪报告中,my_data[n_vertex]
是list
。您无法通过list
索引访问non-integer
。例如,您可以通过[0,length - 1]范围内的索引访问它。
list1 = ["a", "b", "c"] # 3 elements
print list1[0]
print list1[1]
print list1[2] # length - 1
您可能需要read more about lists。
注意在Python中,任何不可变类型(str
,int
,...)都可以访问dictionaries。
答案 4 :(得分:0)
这意味着my_data[n_vertex]
解析为一个列表,并且当列表只接受整数下标时,您尝试通过字符串键访问其中一个项目。
如果您在程序中添加以下行:
print type(my_data[n_vertex])
它会打印<type 'list'>
。
您的代码中可能存在创建my_data
对象的错误。
您可能希望my_data
上的项目为dict而不是列表。