Một lựa chọn thay thế - tùy thuộc vào mục đích sử dụng của bạn, là sử dụng các bộ như phím thay vì các từ điển lồng nhau:
mydict = {}
mydict['foo', 'bar', 'foobar'] = 25
này sẽ hoạt động hoàn toàn tốt trừ khi bạn muốn lấy cành cây tại bất kỳ điểm nào (bạn không thể nhận được mydict ['foo'] trong trường hợp này).
Nếu bạn biết có bao nhiêu lớp làm tổ mà bạn muốn, bạn cũng có thể sử dụng functools.partial
thay vì lambda.
from functools import partial
from collections import defaultdict
tripledict = partial(defaultdict, partial(defaultdict, dict))
mydict = tripledict()
mydict['foo']['bar']['foobar'] = 25
nào một số người thấy dễ đọc hơn, và nhanh hơn để tạo ra các trường hợp so với giải pháp lambda dựa trên tương đương:
python -m timeit -s "from functools import partial" -s "from collections import defaultdict" -s "tripledefaultdict = partial(defaultdict, partial(defaultdict, dict))" "tripledefaultdict()"
1000000 loops, best of 3: 0.281 usec per loop
python -m timeit -s "from collections import defaultdict" -s "recursivedict = lambda: defaultdict(recursivedict)" "recursivedict()"
1000000 loops, best of 3: 0.446 usec per loop
Mặc dù, như mọi khi, không có điểm tối ưu hóa cho đến khi bạn biết có là một nút cổ chai, vì vậy hãy chọn những gì hữu ích nhất và có thể đọc được trước những gì là nhanh nhất.
Nguồn
2012-04-18 21:57:02
bản sao có thể có của [Tạo khóa dict python khi đang di chuyển] (http://stackoverflow.com/questions/3405073/generating-python-dict-keys-on-the-fly) – unutbu