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

如何为defaultdict指定key的集合元素添加前缀?

问题描述

我有一个defaultdict(set)结构的数据:

defaultdict(<class 'set'>, {'key1': {'val1'}, 'key2': {'val2', 'val3'}})

我希望为key2对应的集合元素添加前缀foo-,得到如下结果:

defaultdict(<class 'set'>, {'key1': {'val1'}, 'key2': {'foo-val2', 'foo-val3'}})

我尝试使用如下for循环实现:

for i in my_set["key2"]:
    i_new = "foo-"+i
    my_set["key2"].remove(i)
    my_set["key2"].add(i_new)

但结果却变成了:'key2': {'foo-val2', 'foo-foo-val3'},请问正确的实现方法是什么?

问题原因与解决方法

问题出在遍历集合的同时修改集合——集合的迭代器会实时响应集合的变化,当你移除原元素并添加新元素时,新元素可能会被迭代器再次捕获,导致重复处理(比如val3被遍历两次,第二次给已经加过前缀的foo-val3又加了一次前缀)。

推荐两种正确实现方式:

方式一:遍历集合的副本

先把key2对应的集合转换成独立列表,遍历这个列表来修改原集合,避免迭代器受原集合变化影响:

# 用list()生成集合的副本,遍历副本而非原集合
for i in list(my_set["key2"]):
    my_set["key2"].remove(i)
    my_set["key2"].add(f"foo-{i}")

方式二:直接生成新集合替换(更简洁高效)

不需要修改原集合,直接推导生成带前缀的新集合替换原key2的值:

my_set["key2"] = {f"foo-{val}" for val in my_set["key2"]}

内容的提问来源于stack exchange,提问作者user22990699

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:32:02