打印dict
和defaultdict
:
>>> d = {'key': 'value'}
>>> print(d)
{'key': 'value'}
>>> dd = defaultdict(lambda: 'value')
>>> dd['key']
'value'
>>> print(dd)
defaultdict(<function <lambda> at 0x7fbd44cb6b70>, {'key': 'value'})
使用嵌套结构会变得丑陋:
>>> nested_d = {'key1': {'key2': {'key3': 'value'}}}
>>> print(nested_d)
{'key1': {'key2': {'key3': 'value'}}}
>>> def factory():
... return defaultdict(factory)
...
>>> nested_dd = defaultdict(factory)
>>> nested_dd['key1']['key2']['key3'] = 'value'
>>> print(nested_dd)
defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key1': defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key2': defaultdict(<function factory at 0x7fbd44cd4ea0>, {'key3': 'value'})})})
默认情况下是否有任何理由不使其成为人类可读的? (UPD:我的意思是默认情况下没有为__str__
定义自定义defaultdict
的原因是什么?)
答案 0 :(得分:1)
list = list.filter(function (x, i, a) {
return a.indexOf(x) == i;
});
输出(repr()
没有defaultdict
,只有__str__
)调试输出。它并不意味着漂亮,它意味着功能。它告诉您类型,产生默认值的callable的__repr__
和内容。
这通常用于调试,因此表示信息丰富且明确无误。
与Python中的所有数据类型一样(由于显而易见的原因除了字符串),没有定义非正式的(repr()
),因为程序员需要决定哪种输出适合他们的用例。没有默认值可以设置,因为用例变化如此广泛。例如,文件的输出与输出到GUI或网页的需求不同。
在Python 2中,首先将对象转换为普通字典,然后使用__str__
,如果你想要的话,那就是&#39;漂亮&#39;输出:
pprint()
在Python 3中,def todict(d):
if not isinstance(d, dict):
return d
return {k: todict(v) for k, v in d.items()}
pprint(todict(nested_dd))
直接支持pprint
:
defaultdict
答案 1 :(得分:1)
没有办法知道作者是在思考什么,甚至不知道他们是否给予了很多考虑。
对于嵌套defaultdict
的特定情况,如示例代码所示:
def factory():
return defaultdict(factory)
nested_dd = defaultdict(factory)
nested_dd['key1']['key2']['key3'] = 'value'
您可以通过以下方式对dict
进行子类化来避免此问题:
class Tree(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
nested_dd = Tree()
nested_dd['key1']['key2']['key3'] = 'value'
print(nested_dd) # -> {'key1': {'key2': {'key3': 'value'}}}
由于子类没有定义自己的__repr__()
或__str__()
方法,因此print
(和pprint
}的实例就像常规dict
一样实例。