2012-01-28 62 views
10

Tôi thường sử dụng các thành ngữ sau khi làm việc với một cuốn từ điển Python:Cách kiểm tra khóa trong defaultdict mà không cập nhật từ điển (Python)?

try: 
    val = dct[key] 
except KeyError: 
    print key, " is not valid" 

vì đối với từ điển lớn, báo cáo kết quả

if key in dct: 
    # do something 

không phải là rất hiệu quả (vì vậy tôi nhớ đọc, nhưng tôi đã chú ý nó trong thực tế)

Hôm nay tôi đã làm việc với một defaultdict và trong một khoảnh khắc tôi quên rằng một defaultdict sẽ không bao giờ cung cấp cho bạn một KeyError mà thay vào đó sẽ cập nhật từ điển gốc.

Tôi làm cách nào để thực hiện tra cứu mà không cập nhật defaultdict? Tôi thực sự cần in một lỗi để người dùng có thể nhập lại khóa.

Cảm ơn bạn!

CẬP NHẬT: Một số áp phích cho rằng niềm tin của tôi rằng if key in dct: là chậm. Tôi quay lại và kiểm tra cuốn sách mà tôi đã đọc tốt hơn là sử dụng try: except:. Đó là sách dạy nấu ăn Python năm 2002, Công thức 1.4 của Alex Martelli, có thể tìm thấy trực tuyến tại đây: Add an entry to dictionary. Ký ức cũ quá đáng tin cậy! Công thức không đề cập đến "chậm hơn" và nó thậm chí không sử dụng in nhưng has_key. Nó chỉ đơn giản nói rằng try: except: là nhiều Pythonic (ít nhất là phiên bản cuốn sách của công thức). Cảm ơn bạn đã sửa và trả lời.

+0

Có thể trùng lặp http://stackoverflow.com/questions/1602934/what-is-a-good-way-to-test-if-a-key-exists-in-python-dictionary –

+1

Không phải là bản dupe; cái này về 'defaultdict'. –

+7

'khóa trong d' không chậm, thời gian. Nếu bạn nói cách khác, bạn tốt hơn có bằng chứng vững chắc. 'timeit' nói nó nhanh như một thành công' d [key] ', và nhiều (gần 10x) nhanh hơn một' d [key] '+' ngoại trừ: pass' (được cấp, nó có thể hơi nhanh hơn một 'rõ ràng) nếu' nếu khóa gần như luôn luôn hiện diện). Bây giờ, khóa 'key in d.keys()' (Python 2.x) hoặc 'trong danh sách (d.keys()) '(Python 3.x) là chậm, nhưng bởi vì nó cố tình vứt bỏ thông tin bảng băm. – delnan

Trả lời

17

Tôi làm cách nào để thực hiện tra cứu mà không cập nhật defaultdict?

Với key in dct, tức là rõ ràng.

Nếu đây là thực sự quá đắt đối với bạn (đo lường và bạn sẽ chắc chắn), có cách giải quyết cho các tình huống cụ thể. Ví dụ, nếu giá trị mặc định của bạn là 'ham' và trong một số trường hợp bạn không muốn lưu trữ (key, 'ham') trong defaultdict khi key không tìm thấy, bạn có thể làm

dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything 
+7

'has_key' không được dùng để ưu tiên' khóa trong dct' - vui lòng không quảng bá việc sử dụng các thành ngữ cũ. – PaulMcG

8

key in dct để được nhanh chóng, nói rằng là chậm sẽ giống như nói rằng dct[key] là chậm, và đó không bao giờ phải là trường hợp. Lấy một phần tử từ một từ điển cho khóa và kiểm tra thành viên của một khóa phải là các hoạt động O (1) trong bất kỳ thực thi từ điển nào và dễ dàng xem hoạt động thành viên có thể được thực hiện như thế nào về hoạt động truy cập.

Đối với câu hỏi của bạn với defaultdict, chỉ cần sử dụng in. Và không có lý do gì để tránh sử dụng in trong từ điển thông thường.

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