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

7

我有一个字典,在对象初始化时构建。我知道它在对象生命周期内不会发生变化。该字典将键映射到集合。我想将所有的值从 set 转换为 frozenset,以确保它们不会被更改。目前我的做法如下:

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

有没有更简单的方法来实现这个?我不能立即构建frozenset,因为在构建完整个字典之前,我不知道每个集合中会有多少项。


你需要原地修改还是我们可以构建一个新的字典? - Mike Boers
3个回答

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])}

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)

1
顺便提一下,字典推导式在Python 2.7中也可以使用。 - LarsVegas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接