You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:48:03