我从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,但它仍会挂起脚本。
我可以采取哪些其他措施来提高此操作的效率?
答案 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:
并查看这是否有助于您的第二次尝试更好。