Python -- 验证列表中的元组具有相同的长度

3

这是我的代码:

x = [(1, 2, 3), (4, 5, 6)]

for tup in x:
     if len(tup) == 3:
        print(True) 
     else:
        print(False) 

我想验证列表中的元组长度都是3。如果列表中的任何一个元组具有超过或少于3个值,则要打印单个输出False。如果所有元组都有3个值,则应该打印单个输出True

目前,for循环会产生多个输出。我该如何调整for循环?

5个回答

8
您可以使用all()函数:
if all(len(tup) == 3 for tup in x):
    print(True)
else:
    print(False)

4
你收到了“多余部门”的警告!不要使用 if/else 只是为了打印出 True 或 False。直接从 all 中使用布尔值即可。 - Eric Duminil
2
我同意,但我可能错误地假设OP有两个逻辑分支,并且只是为了MCVE而打印 - 但他确实要求打印。我会更新,但@DanilSperansky已经覆盖了这个一行代码。 - AChampion

5

这是一个简短的命令:

print(all(len(t) == 3 for t in x))

我非常确定,如果我有“all”版本可用,我绝对不会使用“set”版本。具体来说,“all”更清晰,并且它具有一旦找到错误长度的元组就能够立即短路的能力。“set”版本在做出决定之前总是会查看每个元组。 - mgilson

1

解决这个问题的便利方法是使用 break 关键字和循环操作,示例如下:

x = [(1, 2, 3), (4, 5, 6)]
tupleCheck = True
for tup in x:
    if len(tup) != 3:
       tupleCheck = False # Here, the program realizes that a tuple does not have a length of 3...
       break # and aborts.
print(tupleCheck)

虽然有点冗余,但这种解决方案非常易读。

大量的代码,而且比使用列表推导和 all() 函数慢。 - tupui
@Y0da 我试图按照 OP 的想法“调整 for 循环”,而不是完全摧毁一切并制作一行代码。但是,如果没有提到上述的“调整”,使用列表推导式 + all() 是更好的解决方案。 - Jerrybibo
我理解你的动机,但我认为这种写法不如列表推导式和all()函数易读且更符合Pythonic风格。@danil-speransky提供了这样的答案,对于每个人写出更符合Pythonic风格的代码都会有所帮助 =) - tupui

0

另一种方法是使用namedTuple。您可以使用它来创建点列表,而无需检查点列表。doc

>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments

我实际上非常喜欢这种方法。在创建数据结构时强制进行格式化比需要在使用它的每个点上检查它要好。 - mgilson

0

这将返回与每个元组对应的列表:

x=[(1,2,3),(1,2,2)]
d=[len(a)==3 for a in x]
p=True
for i in d:
    p= i and p
print p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接