如何从dict快速获取密钥列表

时间:2015-02-26 15:06:13

标签: python python-2.7

我从excel表构建一个字典,最后得到如下内容:

d = {('a','b','c'): val1, ('a','d'): val2}

我用作键的元组包含一些值,目标是获取这些值的列表,这些值的发生次数超过一定次数。

我尝试了两种解决方案,这两种解决方案都需要花费太长时间。

尝试1,简单列表理解过滤器:

keyList = []
for k in d.keys():
    keyList.extend(list(k))

# The script makes it to here before hanging

commonkeylist = [key for key in keyList if keyList.count(key) > 5] 

这需要永远,因为list.count()在理解的每次迭代中遍历最少。

尝试2,创建一个计数字典

keyList = []
keydict = {}
for k in d.keys():
    keyList.extend(list(k))

# The script makes it to here before hanging

for k in keyList:
    if k in keydict.keys():
        keydict[k] += 1
    else:
        keydict[k] = 1

commonkeylist = [k for k in keyList if keydict[k] > 50]

我认为这会更快,因为我们只会在几次遍历所有keyList,但它仍会挂起脚本。

我可以采取哪些其他措施来提高此操作的效率?

2 个答案:

答案 0 :(得分:3)

使用collections.Counter()和生成器表达式:

from collections import Counter

counts = Counter(item for key in d for item in key)
commonkkeylist = [item for item, count in counts.most_common() if count > 50]

在迭代字典时直接生成密钥而不创建中间列表对象。

使用较低计数过滤器进行演示:

>>> from collections import Counter
>>> d = {('a','b','c'): 'val1', ('a','d'): 'val2'}
>>> counts = Counter(item for key in d for item in key)
>>> counts
Counter({'a': 2, 'c': 1, 'b': 1, 'd': 1})
>>> [item for item, count in counts.most_common() if count > 1]
['a']

答案 1 :(得分:0)

  

我认为这会更快,因为我们只遍历所有keyList a   少数几次,但它仍然挂起剧本。

那是因为你还在进行O(n)搜索。替换这个:

for k in keyList:
    if k in keydict.keys():

用这个:

for k in keyList:
    if k in keydict:

并查看这是否有助于您的第二次尝试更好。