Python列表是否有类似于dict.get的等价方法?

16

我有一个整数列表。 我想知道数字13是否出现在其中,如果是,还想知道它在哪里。 我需要像下面的代码一样两次搜索列表吗?

if 13 in intList:
   i = intList.index(13)

对于字典类型,有一个get函数,它可以确定成员资格并执行相同搜索的查找。 那么列表是否有类似的函数呢?

5个回答

14

你自己回答了这个问题,使用index()方法。如果未找到索引,它将抛出异常,因此只需捕获异常即可:

def getIndexOrMinusOne(a, x):
  try:
    return a.index(x)
  except ValueError:
    return -1

永远不要使用空的 except 子句。你应该使用 except IndexError。 - Philippe F
如果你需要以这种方式处理事情,那么很可能你在滥用列表;这看起来像是一种代码异味。 - John Feminella
嗯?这个可以工作,我测试过了... except 不是空的,它包含返回值? - unwind
通过“empty”,我猜他的意思是捕获所有异常类型,而不仅仅是你想要的那个。这样做的话很容易忽略一些未计划的错误。 - kender
@Ali A:一点也不,非常感谢。还要感谢所有留言的人! - unwind
显示剩余4条评论

8

看起来你只能捕获异常了...

try:
    i = intList.index(13)
except ValueError:
    i = some_default_value

4

没有直接符合您要求的匹配。Python邮件列表曾经有过一次关于此问题的讨论,人们得出结论,如果您需要这样做,那么这可能是一种代码异味。如果需要测试成员身份,请考虑使用dictset


这只是压缩了原始代码示例的语法。性能问题未得到解决。Python仍然首先测试列表中是否存在项目,然后搜索项目在列表中的索引。 - David Berger
@David:你说得对。我应该删除代码,专注于第二段,那才是我的真正观点。其他解决方案似乎都是用昂贵的异常抛出/捕获来替代列表检查。 - John Feminella
有人应该在2016年的主题线程中重新请求这个问题 :) 我有一种感觉,随着map和reduce变得越来越受欢迎,关于什么是“代码味道”的不同看法可能会浮出水面。 - Merlyn Morgan-Graham

2
您可以捕获ValueError异常,或者您可以执行以下操作:
i = intList.index(13) if 13 in intList else -1

(Python 2.5+)

顺便说一下,如果你要执行一大批类似的操作,可以考虑构建反向字典值 -> 索引。

intList = [13,1,2,3,13,5,13]
indexDict = defaultdict(list)
for value, index in zip(intList, range(len(intList))):
   indexDict[value].append(index)

indexDict[13]
[0, 4, 6]

-1

将你拥有的内容放入一个函数中并使用它 :)

您可以根据自己的偏好,使用if i in list: return list.index(i) 或者 try/except


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接