2012-02-04 65 views
45

Tôi biết bạn có thể sử dụng setdefault (khóa, giá trị) để đặt giá trị mặc định cho một khóa nhất định, nhưng có cách nào để đặt giá trị mặc định của tất cả các khóa thành một số giá trị sau khi tạo dict không?Làm cách nào để đặt giá trị mặc định cho tất cả các khóa của đối tượng dict trong python?

Đặt theo cách khác, tôi muốn dict trả về giá trị mặc định được chỉ định cho mọi khóa mà tôi chưa đặt.

+1

Tập hợp "tất cả các khóa" này bạn đang nói đến là gì? Có vô số khóa tiềm năng, ngay cả khi bạn hạn chế bản thân, ví dụ: dây. Bạn có thể đưa ra một ví dụ? – delnan

+0

bạn có thể sử dụng phương thức get, 'a.get (k [, x]) a [k] nếu k trong a, else x' – Anycorn

+0

Một số trợ giúp theo hướng nghịch đảo: http://stackoverflow.com/questions/7688453/ how-to-fix-default-values-from-a-dictionary-pythonically – aitchnyu

Trả lời

77

Bạn có thể thay thế từ điển cũ của bạn với một defaultdict:

>>> from collections import defaultdict 
>>> d = {'foo': 123, 'bar': 456} 
>>> d['baz'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'baz' 
>>> d = defaultdict(lambda: -1, d) 
>>> d['baz'] 
-1 

Các "lừa" ở đây là một defaultdict có thể được khởi tạo với dict khác. Điều này có nghĩa rằng bạn giữ gìn các giá trị hiện tại bình thường dict của bạn:

>>> d['foo'] 
123 
+2

+1 cho khóa 'lambda', tôi bị kẹt ở đó. – Droogans

+1

Có cách nào để làm việc này với 'get' và các phương thức hay cấu trúc tương tự như' in'? – 0xc0de

+0

Không chỉ 'defaultdict (lambda: -1)' đủ? 'd' là gì? – yiwei

1

Không phải sau khi tạo, không. Nhưng bạn có thể sử dụng số defaultdict ở vị trí đầu tiên, đặt giá trị mặc định khi bạn khởi tạo.

1

defaultdict có thể làm điều gì đó tương tự cho bạn.

Ví dụ:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> d 
defaultdict(<class 'list'>, {}) 
>>> d['new'].append(10) 
>>> d 
defaultdict(<class 'list'>, {'new': [10]}) 
+0

defaultdict có thể giúp OP nhưng ví dụ không liên quan ..... – 0xc0de

2

Đây có phải là những gì bạn muốn:

>>> d={'a':1,'b':2,'c':3} 
>>> default_val=99 
>>> for k in d: 
...  d[k]=default_val 
...  
>>> d 
{'a': 99, 'b': 99, 'c': 99} 
>>> 

>>> d={'a':1,'b':2,'c':3} 
>>> from collections import defaultdict 
>>> d=defaultdict(lambda:99,d) 
>>> d 
defaultdict(<function <lambda> at 0x03D21630>, {'a': 1, 'c': 3, 'b': 2}) 
>>> d[3] 
99 
+0

+1 cho khóa 'lambda', tôi bị kẹt ở đó. – Droogans

4

Trong trường hợp bạn thực sự có nghĩa là những gì bạn dường như để hỏi, tôi sẽ cung cấp này câu trả lời thay thế.

Bạn nói rằng bạn muốn dict để trở một giá trị nhất định, bạn không nói rằng bạn muốn thiết rằng đánh giá cao cùng một lúc, như defaultdict làm. Điều này sẽ làm như vậy:

class DictWithDefault(dict): 
    def __init__(self, default, **kwargs): 
     self.default = default 
     super(DictWithDefault, self).__init__(**kwargs) 

    def __getitem__(self, key): 
     if key in self: 
      return super(DictWithDefault, self).__getitem__(key) 
     return self.default 

Sử dụng như thế này:

d = DictWIthDefault(99, x=5, y=3) 
print d["x"] # 5 
print d[42] # 99 
42 in d  # False 
d[42] = 3 
42 in d  # True 

Ngoài ra, bạn có thể sử dụng một tiêu chuẩn dict như thế này:

d = {3: 9, 4: 2} 
default = 99 
print d.get(3, default) # 9 
print d.get(42, default) # 99 
6

Sử dụng defaultdict

from collections import defaultdict 
a = {} 
a = defaultdict(lambda:0,a) 
a["anything"] # => 0 

Điều này là rất chúng tôi eful cho trường hợp như thế này, trong đó giá trị mặc định cho mỗi khóa được đặt là 0:

results ={ 'pre-access' : {'count': 4, 'pass_count': 2},'no-access' : {'count': 55, 'pass_count': 19} 
for k,v in results.iteritems(): 
    a['count'] += v['count'] 
    a['pass_count'] += v['pass_count'] 
+0

Rất ngắn gọn, cảm ơn bạn! – kmarsh

1

Bạn có thể sử dụng lớp sau. Chỉ cần thay đổi 0 thành bất kỳ giá trị mặc định nào bạn muốn. Giải pháp đã được thử nghiệm trong Python 2.7.

class cDefaultDict(dict): 
    # dictionary that returns zero for missing keys 
    # keys with zero values are not stored 

    def __missing__(self,key): 
     return 0 

    def __setitem__(self, key, value): 
     if value==0: 
      if key in self: # returns zero anyway, so no need to store it 
       del self[key] 
     else: 
      dict.__setitem__(self, key, value) 
Các vấn đề liên quan