在 python 中跟踪索引的正确方法是啥?

Posted

技术标签:

【中文标题】在 python 中跟踪索引的正确方法是啥?【英文标题】:What is the proper way to track indexes in python?在 python 中跟踪索引的正确方法是什么? 【发布时间】:2011-11-06 05:00:40 【问题描述】:

现在我正在像这样在循环中跟踪我的索引

index = 0
for entry in longList:
    if entry == 'foo':
        print index
    index += 1

有没有更好的方法来做到这一点?

【问题讨论】:

你到底想做什么? ***.com/questions/1185545/… 【参考方案1】:
for index, entry in enumerate(longList):
    if entry == 'foo':
        print index

【讨论】:

【参考方案2】:

使用enumerate() 内置函数。

for index, entry in enumerate(longList):
    if entry == 'foo':
        print index

但是,在您的具体情况下,您可以简单地使用index = longList.index("foo")

编辑:如果您想在纯 Python 中尽可能快地找到多个匹配项的索引,以下代码应该可以解决问题:

indices = tuple(index for index, element in enumerate(longList) if element=='foo')

【讨论】:

【参考方案3】:

我喜欢列表理解 :)

[index for (index,entry) in enumerate(longList) if entry == 'foo']

【讨论】:

+1,但(index, entry) 周围的括号不是必需的。请记住,在 Python 中,逗号创建元组,而不是括号。此外,通常最好使用生成器表达式而不是列表推导式。所以,(index for index, entry in enumerate(longList) if entry == 'foo'). 带括号对我来说更容易阅读 :) 确实,如果您只想打印,请使用生成器。【参考方案4】:

是的,最好的方法是这样做:

longList.index('foo')

【讨论】:

+1,但是,如果 "foo" 不是 longList 的成员,这将引发 ValueError,而 OP 的代码根本不会打印任何内容。 如果我们变得特别,它不会找到重复的。 我正在这样做,但是当我运行它超过数千个条目时,它会变得越来越慢,我进入列表越深。这就是为什么我使用我现在使用的循环。 @johnthexiii:你只给.index()打了一次电话。因为它是一个 C 函数,所以它肯定比你自己编写的任何 Python 代码都要快。 是的,但是如果我有多个匹配“foo”的条目怎么办?那么是不是要执行多次搜索,从而减慢一切?【参考方案5】:

使用枚举会更好。

for ind,item in enumerate(longList):
    if item == 'foo':
        print ind

【讨论】:

【参考方案6】:

如果您的列表真的很长而且是静态的,您应该考虑使用查找表(实际上是一个以条目为键的索引列表字典)。在第一次搜索后它几乎可以收回成本,因为您目前总是遍历所有元素。

from collections import defaultdict

# Create and fill the table (only once or whenever the list changes)
lookupTable = defaultdict(list)
for index, entry in enumerate(longList):
    lookupTable[entry].append(index)

# Search the list (as many times as you want)
indexes = lookupTable.get('foo')
# and you get either 'None' or a list of indexes '[1,10,20]'

【讨论】:

+1 我可以看到很多应用程序,我必须对此进行一些研究。

以上是关于在 python 中跟踪索引的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

同时运行跟踪软件和服务器的正确方法是啥? (OpenCV 3)

在 Facebook Messenger 机器人中保存/跟踪状态的正确方法是啥?

在 gdb 中中断失败断言的正确方法是啥?

在python中实现类接口的正确方法是啥

Python - 在 asyncio 中运行函数的正确方法是啥?

在 Python 中使用多处理,导入语句的正确方法是啥?