【问题标题】:Python: list.index fails to find existing elementPython:list.index 找不到现有元素
【发布时间】:2011-10-30 10:20:05
【问题描述】:

有人可以向我解释一下 funcion 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() 会返回异常,尽管 tile 变量是对 tiles[][] 元素的引用吗?非常感谢。

ps:顺便说一句,在这种特定情况下,我正在传递 tile[5][5]

【问题讨论】:

  • 顺便说一句:永远不要使用裸露的except: - 始终明确您想要捕获的异常,否则您可能会捕获一些您不期望的异常。
  • 想一想。如果some_list.index(some_item) 返回i,那么some_list[i] 应该返回some_item。在您拨打index 之后,您期望myIndex 是什么?如果它会起作用,你需要能够说self.tiles[myIndex]。但显然,myIndex 不可能完成这项工作。所以不能指望self.tile.index(tile) 工作。

标签: python list


【解决方案1】:

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')

【讨论】:

  • 它也可以,但它比 Tim Pietzcker 的解决方案效率低一点。不过还是谢谢。
  • 如果你使用.index,那么每次瓦片不在行中时,都会引发一个ValueError。要循环浏览所有行,您必须使用try...except。当您预计会引发大量异常时,使用if 往往比try..except 更快。
【解决方案2】:

虽然元素确实存在,但它不是tiles 的直接成员:

  • tiles 是一个二维列表(列表的列表)。
  • tiles[5]Tiles 的列表。
  • 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

【讨论】:

    【解决方案3】:

    为什么tiles[5][5]和tile指向同一个实例?在我看来,您在 tile[5][5] 处将整个对象抓取为 tile,并尝试将其定位为其中的一个元素。不明白你的意图

    【讨论】:

    • 对不起,我没有答案,但我认为我的观察可以解决问题的原因。也许这是我对问题的一些误解。
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多