[英]How do I check if all the elements of a nested list tree are identical?
我正在尝试创建一个函数allsametree(tree)
,它将列表tree
作为输入,如果列表的所有元素在数字上相同,则返回 TRUE 或 FALSE。 到目前为止,我有以下功能:
def allsametree(tree):
if not type(tree) == list:
return tree
if type(tree) is list:
final_lst = []
for item in tree:
final_lst.append(allsametree(item))
return final_lst[1:] == final_lst[:-1]
虽然在大多数情况下,此函数有效,但在评估allsametree([1, [[[[[2]]]]]])
时allsametree([1, [[[[[2]]]]]])
问题
任何提示或替代方法可以解决这个问题?
您可以递归地将列表转换为一组项目,如果整个集合的长度为 1,则返回 true:
def allsametree(tree):
def to_set(tree):
if isinstance(tree, list):
return {item for obj in tree for item in to_set(obj)}
return {tree}
return len(to_set(tree)) == 1
另一种方法来做到这一点。 将其拆分为两个操作:展平和检查所有值是否相同。
flatten 会将嵌套的可迭代对象转换为单个维度之一。 所以[1, [[[[[2]]]]]]
变成[1,2]
。
然后读取第一个值并循环遍历其余值以检查它们是否与它相同。
这是代码
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)
这将适用于任何iterable
不仅仅是列表,并且因为它使用惰性求值,当它发现两个不相等的值时它会停止。 这可以避免您做不必要的工作。 它还避免实例化在每次递归调用时构造的临时集合(列表、集合等)。
这是一些测试输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.