将集合转换为字典的不可变集合作为值

7 投票
3 回答
8280 浏览
提问于 2025-04-15 23:56

我有一个字典,这个字典是在我的对象初始化时创建的。我知道在这个对象的生命周期内,这个字典是不会改变的。这个字典的作用是把键映射到集合(set)。我想把所有的值从集合转换成不可变集合(frozenset),这样就确保它们不会被修改。目前我这样做:

for key in self.my_dict.iterkeys():
    self.my_dict[key] = frozenset(self.my_dict[key])

有没有更简单的方法来实现这个呢?我不能直接创建不可变集合,因为在我构建完整个字典之前,我不知道每个集合里会有多少个项目。

3 个回答

1

如果你需要在原地进行操作,可能这就是最简单的方法(几乎和你发的差不多):

for key, value in self.my_dict.iteritems():
    self.my_dict[key] = frozenset(value)

这是一个变种,它会创建一个临时的字典:

self.my_dict = dict(((key, frozenset(value)) \
                    for key, value in self.my_dict.iteritems()))
1

在Python 3中,你可以使用字典推导式,这是一种简洁的写法:

d = {k: frozenset(v) for k, v in d.items()}

不过在Python 2中,我不太确定有没有更简短的写法——这个写法至少感觉没那么“多余”:

for k,v in d.iteritems():
    d[k] = frozenset(v)
6

比如说,假设有这样的代码:

>>> d = {'a': set([1, 2]), 'b': set([3, 4])}
>>> d
{'a': set([1, 2]), 'b': set([3, 4])}

你可以直接在原来的地方进行转换,方法是:

>>> d.update((k, frozenset(v)) for k, v in d.iteritems())

这样就能得到结果:

>>> d
{'a': frozenset([1, 2]), 'b': frozenset([3, 4])}

撰写回答