Làm thế nào tôi có thể chuyển đổi một sắc lệnh mặc định
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
là một mệnh lệnh chung?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Làm thế nào tôi có thể chuyển đổi một sắc lệnh mặc định
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
là một mệnh lệnh chung?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Câu trả lời:
Bạn chỉ cần gọi dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
nhưng hãy nhớ rằng một sắc lệnh mặc định là một mệnh lệnh:
>>> isinstance(a, dict)
True
chỉ với hành vi hơi khác, trong đó khi bạn cố gắng truy cập vào một khóa bị thiếu - thông thường sẽ nâng lên một KeyError
- default_factory
thay thế được gọi là:
>>> a.default_factory
<type 'list'>
Đó là những gì bạn thấy khi bạn print a
trước khi phía dữ liệu của từ điển xuất hiện.
Vì vậy, một mẹo khác để khôi phục lại hành vi giống như độc tài hơn mà không thực sự tạo một đối tượng mới là đặt lại default_factory
:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
nhưng hầu hết thời gian điều này không đáng để rắc rối.
default_factory
? Tôi không biết chuyện gì đang xảy ra. Lấy làm tiếc.
default_factory
- đó là hàm mà bạn đã vượt qua khi thực hiện ngay defaultdict
từ đầu, như defaultdict(int)
hoặc defaultdict(list)
. Bất cứ khi nào bạn cố gắng tra cứu một khóa trong từ điển, chẳng a['3']
hạn như trong một từ điển thông thường, bạn sẽ nhận được giá trị hoặc nó tạo ra một KeyError
ngoại lệ (chẳng hạn như lỗi, cho bạn biết rằng không thể tìm thấy khóa đó). Nhưng defaultdict
thay vào đó, nó gọi default_factory
hàm để tạo một giá trị mặc định mới (đó là "mặc định" trong defaultdict
) cho bạn.
pickle
(để lưu các đối tượng python vào một tệp) không thể xử lý defaultdict
s trong nhiều trường hợp .
Nếu câu lệnh mặc định của bạn được định nghĩa đệ quy, ví dụ:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
một cách đơn giản khác để chuyển đổi defaultdict trở lại dict là sử dụng json
module
import json
data = json.loads(json.dumps(data))
và tất nhiên, các giá trị có trong sắc lệnh mặc định của bạn cần được giới hạn trong các kiểu dữ liệu được json hỗ trợ, nhưng sẽ không thành vấn đề nếu bạn không có ý định lưu trữ các lớp hoặc hàm trong dict.
Nếu bạn thậm chí muốn có một phiên bản đệ quy để chuyển đổi một đệ quy defaultdict
cho một dict
bạn có thể thử như sau:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
defaultdict(lambda: defaultdict(int))
): {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)