【问题标题】:Is there a save way to retrieve the index of a list without try catch?有没有一种保存方法可以在不尝试捕获的情况下检索列表的索引?
【发布时间】:2018-12-10 02:23:39
【问题描述】:

我想知道在python 3中是否有一种保存和快速检索列表中元素索引的方法。

想法:

# how I do it 
try:
    test_index = [1,2,3].index(4) # error
except:
    # handle error


# how I would like to do it: 
test_index = [1,2,3].awesome_index(4) # test_index = -1
if test_index == -1: 
    # handle error

我不想使用 try, except 的原因是因为 try-except appears to be a little bit slower that an if-statement。由于我要处理大量数据,因此性能对我来说很重要。

是的,我知道我可以通过简单地遍历列表来实现 awesome_index,但我假设已经有一个函数以一种非常有效的方式做到了这一点。

【问题讨论】:

  • 如果你的代码有瓶颈,那肯定不是。
  • Python: Find in list的可能重复
  • @khelwood 不同意,这个问题并没有给他答案
  • @Bharel 的答案为如何在不引发异常的情况下在列表中查找项目的索引提供了许多建议。仅仅因为它们与您的答案不同并不意味着它们不是答案
  • @khelwood 正如他所说,OP 相当聪明,“是的,我知道我可以通过简单地遍历列表来实现 awesome_index”。他们都在上面循环。

标签: python-3.x error-handling try-except index-error


【解决方案1】:

没有这样的东西,但我喜欢你的想法,所以让我们以此为基础:

如果您只有一个索引,并针对它创建许多查询,为什么不在该索引旁边维护一个set()dict()

numbers = [1,2,3]
unique_nunbers = set(numbers)

if 4 in unique_nunbers:
  return numbers.index(4)

字典选项:

numbers = [1,2,3]
unique_nunbers = dict(zip(numbers, range(len(numbers))))

index = unique_nunbers.get(4)
if index is None:
    # Do stuff

在集合和字典中查找 O(1),因此 4 in unique_numbers 几乎没有成本。迭代整个列表以防万一有些东西不存在,这是一个浪费的 O(n) 操作。

这样,你的代码效率更高,算法更好,没有例外!

请记住,不能对 4 in numbers 说同样的话,因为它会遍历整个列表。

【讨论】:

  • 非常感谢您的建议!我会试试这个!
  • 当然!欢迎您对它进行时间测试,看看它对于多次查找要快得多。请记住,您应该只创建一次set()!如果您还有其他问题,请随时提问。
  • @User12547645 如果您没有对列表进行太多修改,我强烈建议您使用dict() 而不是一组,正如@khelwood 建议的那样。它会给你一个真正的 O(1) 操作。
  • 是的,我认为这真的很有意义。感谢您的建议
猜你喜欢
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2022-08-17
  • 2019-10-30
相关资源
最近更新 更多