簡體   English   中英

如何檢查嵌套列表樹的所有元素是否相同?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM