【问题标题】:Python - Why do the find and index methods work differently?Python - 为什么查找和索引方法的工作方式不同?
【发布时间】:2013-12-23 00:09:31
【问题描述】:

在 Python 中,findindex 是非常相似的方法,用于查找序列类型中的值。 find 用于字符串,index 用于列表和元组。它们都返回找到提供的参数的最低索引(最左边的索引)。

例如,以下两个都将返回1

"abc".find("b")
[1,2,3].index(2)

然而,我有点困惑的一件事是,尽管这两种方法非常相似,并且扮演几乎相同的角色,只是对于不同的数据类型,它们对试图找到不在其中的东西有非常不同的反应顺序。

"abc".find("d")

返回-1,表示“未找到”,而

[1,2,3].index(4)

引发异常。

基本上,为什么他们有不同的行为?是有什么特殊原因,还是只是没有特殊原因的奇怪的不一致?

现在,我不是在问如何处理这个问题——显然,try/except 块或条件in 语句都可以。我只是在询问在特定情况下使行为不同的基本原理是什么。对我来说,为了一致性起见,将特定行为说为未找到更有意义。

另外,我并不是要就原因是否是一个好理由征求意见——我只是好奇是什么原因

编辑: 有人指出字符串也有一个index 方法,它的工作方式类似于列表的index 方法,我承认我不知道,但是只是让我想知道为什么,如果字符串两者都有,列表只有index

【问题讨论】:

  • 请注意 str.index 存在,其功能与 list.index 类似。
  • str.index 的文档描述是“与 find() 类似,但在未找到子字符串时引发 ValueError。”所以答案可能只是列表中没有 find 的等价物。
  • 这两种方法的一个区别是可以找到子字符串:'abc'.find('bc')
  • 哦,我没有意识到字符串也有索引方法,这很有趣。
  • @DonaldMiner 字符串的索引也很乐意处理它,cf 'abc'.index('bc')

标签: python methods indexing find consistency


【解决方案1】:

这一直很烦人 ;-) 与一个答案相反,-1 就字符串而言并没有什么特别之处。例如,

>>> "abc"[-1]
'c'
>>> [2, 3, 42][-1]
42

find() 在实践中的问题在于 -1 实际上作为索引是特殊的。因此,使用find() 的代码在没有找到要搜索的东西时很容易出现意外——甚至在 Python 1.0.0 发布之前就注意到这样的代码经常会做错事。

当使用index() 代替时不会发生这样的意外——异常不能被忽略。但是为这样一个简单的操作设置try/except 不仅烦人,而且会增加“应该”快速操作的主要开销(额外时间)。因此,string.find() 在 Python 0.9.9 中被添加(在此之前,只能使用 string.index())。

所以我们两者都有,甚至在 Python 3 中仍然存在。选择你的毒药 :-)

【讨论】:

  • 这很奇怪,但同时也令人失望!
  • 当我不知道值是否存在时,我通常使用 find()(因此,我会手动检查结果,即 LYBL 类型的编程风格),如果我使用 index()期望值在那里(如果不是,则抛出异常 EAFP 样式)。编辑:重点是,它们进行了不同的优化以支持不同的编码风格/目的。
  • @ThomasOrozco,有时没有一个很好的答案! ;-) 几十年来,python-dev 上的人们一直在尝试找到一个用于序列搜索,断断续续的。到目前为止,似乎没有什么比目前奇怪的不令人满意的 index/find 方法更好。
  • 既然-1 是一个有效的索引,我想知道他们为什么选择它来表示“未找到子字符串”。让它返回None 不是更清楚吗?毕竟,“显式胜于隐式”。 -1None 更明确,“找不到子字符串”?
  • @iCodez,呸! ;-) 然后很多代码会将“在索引 0 处找到”结果与FalseNone 混淆。特别注意0 == False 为真,False0 作为索引的作用相同!如果您要返回一个特殊值,那么检查< 0 就像检查其他任何内容一样容易,并且至少返回类型是完全可预测的。任何非异常方案的问题在于人们通常会忘记检查。
猜你喜欢
  • 2011-12-21
  • 2013-07-16
  • 1970-01-01
  • 2016-06-21
  • 2023-02-25
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多