2011-10-30 168 views
3

有人可以向我解释funcion list.index()的功能吗?我有以下代码:Python:list.index找不到现有的元素

def getPos(self,tile): 
     print self.tiles[5][5] 
     print tile 
     try: 
      myIndex = self.tiles.index(tile) 
      #some code 
     except: 
      print "exception raised" 
      #some code 

结果:

<Tile.Tile instance at 0x36BCEB8> 
<Tile.Tile instance at 0x36BCEB8> 
exception raised 

你有一个想法,为什么list.index()返回一个例外,虽然瓷砖变量是瓷砖的元素[引用] []?非常感谢。

PS:顺便说一句我传递瓦片[5] [5]在该特定情况下

+1

作为一个方面:绝不要使用裸露的'except:' - 对于你想要捕捉的异常,一定要具体说明,否则你可能会捕获一些你并不期望的东西。 –

+0

想一想这件事。如果'some_list.index(some_item)'返回'i',那么'some_list [i]'应该返回'some_item'。你在'index'调用之后期待'myIndex'是什么?如果它能够工作,你需要能够说'self.tiles [myIndex]'。但是,显然没有'myIndex'可以完成这项工作。所以'self.tile.index(tile)'不能指望工作。 – Ben

回答

3

虽然元件确实存在,所以不能直接的tiles的成员:

  • tiles是一个二维列表(列表的列表)。
  • tiles[5]Tile s的列表。
  • tiles[5][5]是单个Tile

Python不会递归地下降到多维列表中以查找要查找的元素。因此tiles.index(tile)失败; tiles[5].index(tile)会起作用。

为了说明:

>>> l = [[1,2], [3,4]] 
>>> l.index(4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: 4 is not in list 
>>> l[1].index(4) 
1 
+0

它的工作原理,谢谢 – gramm

4

self.tiles似乎是序列的序列(例如列表或元组)。 self.tiles的元素是序列,而不是瓦片。

self.tiles.index(tile)试图找到等于tile的序列,并且失败。

尝试,而不是:

def getPos(self,tile): 
    for i,row in enumerate(self.tiles): 
     for j,elt in enumerate(row): 
      if tile == elt: 
       return (i,j) 
    raise ValueError('no tile found') 
+0

它也可以工作,但效率比Tim Pietzcker的解决方案低一点。不过谢谢。 – gramm

+0

如果您使用'.index',那么每次该图块不在该行中时,将引发一个ValueError。要遍历所有行,您必须使用'try ... except'。当你期望提出很多异常时,使用'if'往往比'try..except'快。 – unutbu

+0

我会记住这一点,谢谢。 – gramm

-1

怎么来的砖[5] [5]和瓷砖指向同一个实例?在我看来,你抓住了整个这个对象在[5] [5]瓦片,并试图找到它作为它的一个元素。不理解你的意图

+0

对不起,我没有回答,但我认为我的观察导致解决问题的原因。也许这是我对问题的误解。 – yosukesabai