gpt4 book ai didi

python - 查找键以相同前缀开头的字典值的更有效方法

转载 作者:太空狗 更新时间:2023-10-29 22:25:56 25 4
gpt4 key购买 nike

我有一个字典,它的键位于共享相同前缀的集合中,如下所示:

d = { "key1":"valA", "key123":"valB", "key1XY":"valC",
"key2":"valD", "key2-22":"valE" }

给定一个查询字符串,我需要查找与以该前缀开头的键关联的所有值,例如对于 query="key1" 我需要得到 ["valA", "valB", "valC"]

我下面的实现有效,但对于大量查询来说太慢了,因为字典 d 有大约 30,000 个键,而且大多数键的长度都超过 20 个字符:

result = [d[s] for s in d.keys() if s.startswith(query)]

有没有更快/更有效的方法来实现它?

最佳答案

您可以避免生成由 dict.keys()(在 python 2.x 中)生成的中间列表:

result = [d[key] for key in d if key.startswith(query)]

但是您很可能希望使用 trie 而不是字典,这样您就可以找到与具有公共(public)前缀的键关联的所有值(trie 类似于基于前缀的树)。

Here 你可以找到一些不同的尝试实现。

A trie for keys "A", "to", "tea", "ted", "ten", "i", "in", and "inn".

A trie for keys "A", "to", "tea", "ted", "ten", "i", "in", and "inn". (source wikipedia)


让我们比较一下不同解决方案的时间:

# create a dictionary with 30k entries
d = {str(x):str(x) for x in xrange(1, 30001)}
query = '108'

# dict with keys()
%timeit [d[s] for s in d.keys() if s.startswith(query)]

100 loops, best of 3: 8.87 ms per loop

# dict without keys()
%timeit [d[s] for s in d if s.startswith(query)]

100 loops, best of 3: 7.83 ms per loop

# 11.72% improvement

# PyTrie (https://pypi.python.org/pypi/PyTrie/0.2)
import pytrie
pt = pytrie.Trie(d)

%timeit [pt[s] for s in pt.iterkeys(query)]

1000 loops, best of 3: 320 µs per loop

# 96.36% improvement

# datrie (https://pypi.python.org/pypi/datrie/0.7)
import datrie
dt = datrie.Trie('0123456789')
for key, val in d.iteritems():
dt[unicode(key)] = val

%timeit [dt[s] for s in dt.keys(unicode(query))]

10000 loops, best of 3: 162 µs per loop

# 98.17% improvement

关于python - 查找键以相同前缀开头的字典值的更有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com