假设我有一个python字典:
{'i:crid1':1, 'c:crid1':1, 'i:crid2':1, 'c:crid2':1....}
python中最优雅的方法是提取以c:?
开头的所有键{'c:crid1':1,'c:crid2':1....}
速度至关重要,可能是一个很大的决定。也许编织是一种候选工具。
我添加了这条评论。这些词汇来自redis。没有选择数据结构......正如所说的那样。我需要速度。不优雅。
答案 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:'))
并迭代它。