<p>我喜欢nneonneo的答案,而且应该比较快,但我希望不创建额外的不必要的数据结构(我一直在学习Python中的内存碎片)。这可能快,也可能不快。</p>
<p>(编辑:剧透!)</p>
<blockquote class="spoiler">
<p> Faster by a decent enough margin to make it preferable in all cases, see the other analysis answer.</p>
</blockquote>
<p>但是,如果要处理很多这样的问题,并且有内存问题,那么最好这样做。</p>
<h3>实施</h3>
<p>这在Python 3中应该有效,如果将<code>keys</code>转换为<code>viewkeys</code>,可能是2.7,当然不是2.6。它依赖于dict拥有的键的集合视图:</p>
<pre><code>def sameshape(d1, d2):
if isinstance(d1, dict):
if isinstance(d2, dict):
# then we have shapes to check
return (d1.keys() == d2.keys() and
# so the keys are all the same
all(sameshape(d1[k], d2[k]) for k in d1.keys()))
# thus all values will be tested in the same way.
else:
return False # d1 is a dict, but d2 isn't
else:
return not isinstance(d2, dict) # if d2 is a dict, False, else True.
</code></pre>
<p><em>编辑</em>更新以减少冗余类型检查,现在更有效。</p>
<h3>测试</h3>
<p>检查:</p>
<pre><code>print('expect false:')
print(sameshape({'foo':{'bar':{None:None}}}, {'foo':{'bar':{None: {} }}}))
print('expect true:')
print(sameshape({'foo':{'bar':{None:None}}}, {'foo':{'bar':{None:'foo'}}}))
print('expect false:')
print(sameshape({'foo':{'bar':{None:None}}}, {'foo':{'bar':{None:None, 'baz':'foo'}}}))
</code></pre>
<p>印刷品:</p>
<pre><code>expect false:
False
expect true:
True
expect false:
False
</code></pre>