Python list.index() 与字典

Python list.index() versus dictionary

我有大约 50 个字符串的列表。我会反复(可能数万次)需要知道列表中项目的位置。是每次都使用 list.index() 更好,还是创建一个字典将每个项目映射到它的位置? (我的直觉是创建字典,但我不知道列表索引的基础是什么,它可能是多余的。)

使用字典映射而不是在列表中查找项目。字典映射在计算之前使用每个项目的哈希值。哈希比较要快得多,并且可以更快地找到(在恒定时间内),而不是通过列表查找并逐项评估(在线性时间内缩放)。

您可以像这样分析您的查询:

import timeit
setup = 'from __main__ import foo_dict, foo_list'

要将比较限制为仅 50 长的列表:

l = list(str(i) for i in range(50))
d = dict((str(i), i) for i in range(50))
def foo_dict(k):
    return d[k]

def foo_list(k):
    return l.index(k)

timeit.repeat('[foo_dict(str(i)) for i in range(50)]', setup)

returns 对我来说:

[20.89474606513977, 23.206938982009888, 22.23725199699402]

timeit.repeat('[foo_list(str(i)) for i in range(50)]', setup)

returns:

[47.33547496795654, 47.995683908462524, 46.79590392112732]

字符串的字典查找要快得多,因为它使用哈希 table,而索引的列表查找要慢得多,因为它必须根据要查找的字符串评估其中的每个字符串.

list.index() 将遍历列表,直到找到它要查找的项目,这是一个线性时间操作。相比之下,在字典中查找字符串是一个常量时间操作,因此字典方法可能具有更好的性能。

由于您的键是字符串并且您拥有的键相对较少,因此您可能想要探索的另一种数据结构是 trie

字典会快很多,创建起来也很快:

indexer = dict((v, i) for i, v in enumerate(thelist))

enumeratei in range(len(thelist)) 生成 (i, thelist[i]),从那里生成器表达式 "swapping" 元组(因为您需要将内容映射到索引,反之亦然)。

请注意,这仅在每个列表项都是可散列的情况下才有效,但既然你说这些项目是字符串,你应该没问题。

dict,除其他外,快速将 (key, value) 元组的可迭代转换为相应的字典。