擅长:python、mysql、java
<p>要扩展我的评论,您可以递归地创建我所称的“类型映射”:</p>
<pre><code>def typemap(lst_or_obj):
if not isinstance(lst_or_obj, list):
return type(lst_or_obj)
return [typemap(obj) for obj in lst_or_obj]
</code></pre>
<p>然后使用它来获取结构中的类型:</p>
<pre><code>a = [1, 2, ['three', 4]]
b = [5, 6, ['seven', 8]]
c = [9, 10, [11, 'twelve']]
ta = typemap(a)
tb = typemap(b)
tc = typemap(c)
print(ta)
print(tb)
print(tc)
print(ta == tb)
print(ta == tc)
</code></pre>
<p>输出:</p>
<pre><code>[<class 'int'>, <class 'int'>, [<class 'str'>, <class 'int'>]]
[<class 'int'>, <class 'int'>, [<class 'str'>, <class 'int'>]]
[<class 'int'>, <class 'int'>, [<class 'int'>, <class 'str'>]]
True
False
</code></pre>
<p>那么你的功能就是:</p>
<pre><code>def deepcompare(a, b):
return typemap(a) == typemap(b)
</code></pre>
<p>如果您需要处理列表以外的事情,您可以简单地将<code>isinstance</code>检查扩展到<code>(list, tuple)</code>,但是您很快就会遇到问题,比如<code>str</code>(递归迭代字符串是一个问题,因为单个字符或空字符串本身就是一个iterable,所以您的程序会爆炸)和<code>dict</code>(排序问题,比较键和/或值…)。你知道吗</p>