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

2024-10-02 18:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个函数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]]]]]])时遇到了问题

您有什么建议或其他解决此问题的方法吗


Tags: 函数falsetruetree元素列表returnif
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

另一种方法。将其拆分为两个操作:展平和检查所有值是否相同

展平将嵌套的iterable转换为单个维度的iterable。所以[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,因为它使用延迟求值,当它找到两个不相等的值时,它将停止。这可以避免你做不必要的工作。它还可以避免在每次递归调用时实例化正在构造的临时集合(列表、集合等)

Here's一些测试输入

相关问题 更多 >