[英]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.