给定一个python字典,最有效的方法是提取以字符串模式开头的键

时间:2012-03-20 22:48:29

标签: python

假设我有一个python字典:

{'i:crid1':1, 'c:crid1':1, 'i:crid2':1, 'c:crid2':1....}

python中最优雅的方法是提取以c:?

开头的所有键
{'c:crid1':1,'c:crid2':1....}

速度至关重要,可能是一个很大的决定。也许编织是一种候选工具。

我添加了这条评论。这些词汇来自redis。没有选择数据结构......正如所说的那样。我需要速度。不优雅。

4 个答案:

答案 0 :(得分:3)

如果速度属于重要性,你可能想要首先构建一个dicts的dict,其中外部dict由前缀索引:

dd = {'i':{ 'i:crid1':1, 'i:crid2':1 }, 'c':{'c:crid1':1, 'c:crid2':1 } }

如果空间不是对象,并且您有时想要整个dict而不是前缀子集,则可以并排构建one-big-dict和dict-of-dict版本;否则,当你需要的时候,它就不会很难建立起来。

答案 1 :(得分:2)

使用dict理解既快速又简洁,但如果速度确实是一个问题,那么dict在一开始似乎并不合适:

>>> d = {'i:crid1':1, 'c:crid1':1, 'i:crid2':1, 'c:crid2':1 }
>>> { k:v for k,v in d.iteritems() if k.startswith('c:') }
{'c:crid2': 1, 'c:crid1': 1}

或者,如果您在2.7之前使用Python:

>>> dict((k, v) for k,v in d.iteritems() if k.startswith('c:'))
{'c:crid2': 1, 'c:crid1': 1}

答案 2 :(得分:2)

>>> d = {'i:crid1': 1, 'c:crid1': 1, 'i:crid2': 1, 'c:crid2': 1}
>>> %timeit dict((k, v) for k, v in d.iteritems() if k.startswith('c:'))
    # 100000 loops, best of 3: 4.12 us per loop
>>> import re
>>> patt = re.compile('^c:.')
>>> %timeit dict((k, v) for k, v in d.iteritems() if patt.match(k))
    # 100000 loops, best of 3: 5.22 us per loop
>>> { k:v for k,v in d.iteritems() if k.startswith('c:') }
    # 100000 loops, best of 3: 2.22 us per loop

答案 3 :(得分:1)

对于python版本< 2.7如果您没有字典理解,可以使用

>>> d = {'i:crid1':1, 'c:crid1':1, 'i:crid2':1, 'c:crid2':1 }
>>> dict((k, v) for k,v in d.iteritems() if k.startswith('c:'))
{'c:crid2': 1, 'c:crid1': 1}

要仅提取密钥,您可以使用

(k for k in d.iterkeys() if k.startswith('c:'))

并迭代它。