2010-06-14 3 views
5

У меня есть словарь, который построен как часть инициализации моего объекта. Я знаю, что он не изменится во время жизни объекта. Словарь сопоставляет ключи с наборами. Я хочу преобразовать все значения от set s до frozenset s, чтобы убедиться, что они не изменяются. В настоящее время я делаю это вот так:Преобразование наборов в фризонсет как значения словаря

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

Есть ли более простой способ достичь этого? Я не могу сразу построить frozenset, потому что я не знаю, сколько элементов будет в каждом наборе, пока я не построю полный словарь.

+0

Вам нужно сделать это на месте или мы можем uild новый dict? –

+0

На месте было бы предпочтительнее. –

ответ

5

Учитывая, например,

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

Это вариант, который строит временную Dict:

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

В Python 3, вы можете использовать словарь понимание:

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

В Python 2, хотя я не знаю, что Ther что-Э короче - это по крайней мере, чувствует себя менее "лишними":

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

Понимание словаря также работает в python 2.7. – LarsVegas

Смежные вопросы