Python字典如何创建键或为键追加元素并保证所有元素唯一?
核心性能问题分析
你现有写法的耗时瓶颈在于if a_string not in mydict[a_new_string]判断,列表的存在性检查是O(k)复杂度(k为对应列表的长度),当元素数量较多时耗时会线性增长。
最优实现方案
方案1:用defaultdict(set)实现(性能最高,标准库原生支持)
利用集合(set)的O(1)存在性检查和自动去重特性,性能远高于列表判断,是该场景的首选方案:
from collections import defaultdict mydict = defaultdict(set) for a_string in list_of_strings: document = db.BingResults.find_one({"akey": a_string}) for record in document["key"]: a_new_string = my_function(record["anotherkey"]) # set的add方法自动去重,无需手动判断存在性 mydict[a_new_string].add(a_string) # 如果业务要求最终值为列表格式,追加一步转换即可 mydict = {k: list(v) for k, v in mydict.items()}
方案2:保留元素插入顺序的实现(Python 3.7+ 支持)
如果要求列表中元素的顺序和首次插入顺序完全一致(set是无序结构不满足该需求),可以利用Python 3.7+版本字典key天然有序且自动去重的特性实现:
from collections import defaultdict mydict = defaultdict(dict) for a_string in list_of_strings: document = db.BingResults.find_one({"akey": a_string}) for record in document["key"]: a_new_string = my_function(record["anotherkey"]) # 字典key自动去重,且保留插入顺序 mydict[a_new_string][a_string] = None # 转换为要求的列表结构 mydict = {k: list(v.keys()) for k, v in mydict.items()}
性能对比
当单个key对应的元素数量超过10个时,上述两种方案的执行速度是原有写法的数倍到数十倍,元素越多性能提升越明显。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

