擅长:python、mysql、java
<p>另一种方法。将其拆分为两个操作:展平和检查所有值是否相同</p>
<p>展平将嵌套的iterable转换为单个维度的iterable。所以<code>[1, [[[[[2]]]]]]</code>变成了<code>[1,2]</code></p>
<p>然后读取第一个值并循环检查其余值,以检查它们是否与第一个值相同</p>
<p>这是密码</p>
<pre><code>from collections.abc import Iterable
def flatten(iterable):
for i in iterable:
if isinstance(i, Iterable):
yield from flatten(i)
else:
yield i
def allsametree(tree):
flat = flatten(tree)
iterator = iter(flat)
try:
first = next(iterator)
except StopIteration:
return True
return all(first == rest for rest in iterator)
</code></pre>
<p>这不仅适用于列表,而且适用于任何<code>iterable</code>,因为它使用延迟求值,当它找到两个不相等的值时,它将停止。这可以避免你做不必要的工作。它还可以避免在每次递归调用时实例化正在构造的临时集合(列表、集合等)</p>
<p><a href="https://repl.it/repls/MediumpurpleExcitingTransversals#main.py" rel="nofollow noreferrer">Here's</a>一些测试输入</p>