2012-07-18 40 views
5

Tôi có một dict python lớn được tạo từ dữ liệu json và đang tạo một dict nhỏ hơn từ một lớn. Một số yếu tố của từ điển lớn có một khóa gọi là 'chi tiết' và một số yếu tố thì không. Những gì tôi muốn làm là kiểm tra xem khóa có tồn tại trong mỗi mục nhập trong từ điển lớn hay không, thêm phím 'chi tiết' với giá trị 'Không có chi tiết nào có sẵn' vào từ điển mới. Tôi đang đặt một số mã mẫu dưới đây như một minh chứng. LargeDict lớn hơn nhiều với nhiều khóa trong mã của tôi, nhưng tôi giữ nó đơn giản để rõ ràng.Kiểm tra xem khóa có tồn tại trong từ điển hay không. Nếu không, hãy thêm nó

LargeDict = {'results': 
[{'name':'john','age':'23','datestart':'12/07/08','department':'Finance','details':'Good Employee'}, 
{'name':'barry','age':'26','datestart':'25/08/10','department':'HR','details':'Also does payroll'}, 
{'name':'sarah','age':'32','datestart':'13/05/05','department':'Sales','details':'Due for promotion'}, 
{'name':'lisa','age':'21','datestart':'02/05/12','department':'Finance'}]} 

Đây là cách tôi đang nhận dữ liệu cho SmallDict:

SmallDict = {d['name']:{'department':d['department'],'details':d['details']} for d in LargeDict['results']} 

tôi nhận được một lỗi quan trọng tuy nhiên khi một trong những mục dict lớn không có chi tiết. Tôi có đúng khi nói rằng tôi cần sử dụng mô-đun DefaultDict hoặc có cách nào dễ dàng hơn không?

Trả lời

2

Sử dụng phương pháp get(key, defaultVar) để cung cấp một giá trị mặc định khi phím 'details' là mất tích:

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']} 
13

Bạn không cần collections.defaultdict. Bạn có thể sử dụng phương thức từ điển setdefault.

d = {} 
bar = d.setdefault('foo','bar') #returns 'bar' 
print bar # bar 
print d #{'foo': 'bar'} 

Như những người khác đã lưu ý, nếu bạn không muốn thêm khóa vào từ điển, bạn có thể sử dụng phương pháp get.

đây là số cũ reference mà tôi thường thấy mình đang xem.

+0

+1 (Từ các tài liệu) dict.setdefault(): "Nếu khóa có trong từ điển, trở về giá trị của nó Nếu không, chèn chủ chốt với giá trị mặc định và trở lại. mặc định. mặc định là Không. " – heltonbiker

+0

Có. Dùng cái này. defaultdict là một sinh vật tà ác cho người không tự nguyện. – javadba

+1

FWIW, tôi nghĩ 'defaultdict' rất tuyệt. Chủ yếu, tôi không nghĩ rằng nó có giá trị chuyển đổi một 'dict' thường xuyên thành' defaultdict' nếu bạn đã nhận nó từ một nguồn khác. Các "tệ nạn" của 'defaultdict' có thể được phá vỡ chỉ đơn giản bằng cách thiết lập thuộc tính' default_factory' thành 'None' (nó sẽ làm cho nó hoạt động giống như một dict thông thường một lần nữa). – mgilson

4

Bạn có thể sử dụng collections.defaultdict nếu bạn muốn tự động tạo một mục nhập trong số dict của mình. Tuy nhiên, nếu bạn không, và chỉ muốn "Not available" (hoặc bất kỳ), sau đó bạn có thể chỉ cần gán cho dict như d[key] = v và sử dụng d.get(k, 'Not available') cho một giá trị mặc định

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