列表索引必须是整数,而不是str

时间:2014-01-21 03:37:27

标签: php python list

我正在尝试做类似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是我的函数名称

5 个答案:

答案 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中,任何不可变类型(strint,...)都可以访问dictionaries

答案 4 :(得分:0)

这意味着my_data[n_vertex]解析为一个列表,并且当列表只接受整数下标时,您尝试通过字符串键访问其中一个项目。

如果您在程序中添加以下行:

print type(my_data[n_vertex])

它会打印<type 'list'>

您的代码中可能存在创建my_data对象的错误。 您可能希望my_data上的项目为dict而不是列表。