У меня есть словарь, который создается как часть инициализации моего объекта. Я знаю, что это не изменится в течение времени жизни объекта. Словарь отображает ключи к наборам. Я хочу преобразовать все значения из set
s к frozenset
s, для проверки они не становятся измененными. В настоящее время я делаю это как это:
for key in self.my_dict.iterkeys():
self.my_dict[key] = frozenset(self.my_dict[key])
Существует ли более простой способ достигнуть этого? Я не могу создать frozenset
сразу же, потому что я не делаю, каким количеством объекты будут в каждом наборе, пока я не создал полный словарь.
Например,
>>> 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])}
Если вам нужно сделать это на месте, возможно, это самый простой способ (почти такой же, как вы писали):
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()))
В Python 3 вы могли бы использовать понимание словаря:
d = {k: frozenset(v) for k, v in d.items()}
Однако в Python 2 я не знаю, есть ли что-нибудь короче - это, по крайней мере, кажется менее «избыточным»:
for k,v in d.iteritems():
d[k] = frozenset(v)