如何为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
相关产品推荐
相关产品推荐

