2010-06-14 24 views
5

Tôi có từ điển được xây dựng như là một phần của việc khởi tạo đối tượng của tôi. Tôi biết rằng nó sẽ không thay đổi trong suốt cuộc đời của đối tượng. Từ điển ánh xạ khóa để đặt. Tôi muốn chuyển đổi tất cả các giá trị từ set s thành frozenset s, để đảm bảo chúng không bị thay đổi. Hiện tại tôi làm như vậy:Chuyển đổi các tập hợp thành frozensets làm giá trị của từ điển

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

Có cách nào đơn giản hơn để đạt được điều này không? Tôi không thể xây dựng frozenset ngay lập tức, bởi vì tôi không bao nhiêu mục sẽ có trong mỗi bộ cho đến khi tôi đã xây dựng từ điển hoàn chỉnh.

+0

Bạn có cần phải làm điều đó tại chỗ hoặc chúng tôi có thể b uild một dict mới? –

+0

Tại chỗ sẽ được ưu tiên. –

Trả lời

5

Given, ví dụ,

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

Bạn có thể thực hiện chuyển đổi ở vị trí như

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

Với sự kết quả

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

Nếu bạn phải làm điều đó tại chỗ, có lẽ đây là cách đơn giản nhất (gần giống như bạn được đăng):

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

Đây là một biến thể mà xây dựng một dict tạm thời:

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

Trong Python 3, bạn có thể sử dụng một sự hiểu biết từ điển:

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

Trong Python 2, tuy nhiên, tôi không biết rằng ther bất cứ điều gì e của ngắn hơn - điều này ít nhất cảm thấy ít "dư thừa":

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

Một từ điển hiểu cũng hoạt động trong python 2,7 bằng cách này. – LarsVegas

Các vấn đề liên quan