如何确定二维列表是否为“矩形”

2024-04-25 06:07:15 发布

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

现在,我试图让我的程序将一个二维列表作为输入,并根据它是否是“矩形”返回true或false(例如,[2,3],[1,5],[6,9]]是矩形的,而[[2,3],[1,8,6]]不是矩形的)到目前为止,我已经想出了这样的方法:

def rectangular(List):
    n = List
    for i in n:
        if len(i) != len(n[0]):
            return False
        elif len(i) == len(n[0]):
            i

我好像想不出如何创造一个“真实”的案例。使用上面的elif,我可以循环查看列表,但是如果我要添加一个returntrue部分,它会在这种情况下立即停止。在这种情况下,while循环会更好吗?感谢所有的帮助!谢谢。在


Tags: 方法in程序falsetrue列表forlen
3条回答

如果你到最后没有发现一个假案,那么你就知道这是真的,对吧?没有其他的可能性了。在

{{cd2>你只需把cda}完全删除就可以了:

def rectangular(List):
    n = List
    for i in n:
        if len(i) != len(n[0]):
            return False
    return True

作为旁注,你的elifif完全相反的条件,最好写为else:。这样,你就不可能把相反的条件弄错,你的读者就不需要知道它是相反的,等等

另外,没有理由将参数作为List,然后将相同的值绑定到n并使用它。为什么不先拿n?在

^{pr2}$

通过将for语句替换为生成器表达式和all函数,可以使其更加简洁,甚至更具python风格:

def rectangular(n):
    return all(len(i) == len(n[0]) for i in n)

但事实上,这和你已经拥有的没什么不同。你应该学习它是如何工作的,但是如果你还不明白,用更详细的方式来做是没有问题的。在


如果你想变得聪明:

def rectangular(n):
    lengths = {len(i) for i in n}
    return len(lengths) == 1

我们正在制作一套所有的长度。集合没有重复项,因此这是一组所有不同长度的集合。如果只有一个不同的长度,那意味着所有的长度都是一样的。在

但是,请注意,对于空列表,这将返回False(因为有0长度,而不是1),而另外两个将返回True(因为如果没有要测试的值,则所有值的条件都为空)。我不知道你想要哪一个,但要想知道如何改变你选择的相反的一个应该相对容易些。在

可以确保列表中所有元素的长度都相同。或者在Python中:

all(map(lambda m: len(m) == len(x[0]), x))

其中x是您要检查的内容。在

此解决方案的唯一问题是,如果列表看起来像[ [1,2], [1,[1,2]], 'ab' ],它仍将返回True。所以你还需要做一些类型检查。在

尝试在生成器中使用all函数:

def rectangular(lst):
    first_len = len(lst[0])
    # I used lst[1:] to skip the 0th element
    return all(len(x) == first_len for x in lst[1:])

如果iterable的所有元素都是Trueall函数返回{},否则返回{}。在

您没有调用变量list,这很好,但是大写的名称通常表示Python中的一个类,因此lstList更好。在


注意:我假设“矩形”表示每个子列表的长度相同。如果实际上每个子列表都应该(比如)2个元素,只需将first_len替换为文本2,并删除lst[1:]上的{}。您可能还需要添加一些异常处理,以防传递一个只有一个元素的列表。在

相关问题 更多 >