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

Posted

技术标签:

【中文标题】Python - 验证列表中的元组具有相同的长度【英文标题】:Python -- validate tuples in a list have the same length 【发布时间】:2018-02-05 18:02:05 【问题描述】:

这是我的代码:

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 循环产生超过 1 个输出。如何调整 for 循环?

【问题讨论】:

【参考方案1】:

你可以使用all():

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

【讨论】:

您收到来自冗余部门的警告!切勿使用 if/else 来打印 True 或 False。直接从all 使用布尔值;) 我同意,但我可能错误地假设 OP 有 2 个逻辑分支并且只是为 MCVE 打印 - 但他确实明确要求打印。我会更新,但@DanilSperansky 已经覆盖了单线。【参考方案2】:

这是一个单行:

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

【讨论】:

如果我有可用的all 版本,我很确定我永远不会使用set 版本。具体来说,all 更清晰,一旦发现长度错误的元组,它就有能力短路。 set 版本`在做出决定之前总是会查看每个元组。【参考方案3】:

一个方便的解决方案是使用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() 相比,代码多且速度慢 @Y0da 我正在尝试采用 OP 的“调整 for 循环”的想法,而不是完全拆除所有东西并制作单线。但是,如果没有提到前面提到的“调整”,使用 list comp + all() 是更好的解决方案。 我得到了动机,但在我看来,这与列表 comp + all() 相比是不可读的,后者更 Pythonic。这种回答(@danil-speransky)帮助大家更pythonic,写出更好的代码=)【参考方案4】:

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

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

【讨论】:

我真的很喜欢这种方法。最好在创建数据结构时强制对其进行格式化,而不是在使用它的每个点都检查它。【参考方案5】:

这给出了一个对应于每个元组的列表:

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

【讨论】:

以上是关于Python - 验证列表中的元组具有相同的长度的主要内容,如果未能解决你的问题,请参考以下文章

使用python从不同长度的元组列表中删除重复项

Python中的元组和列表

将列表转换为Elm中的元组

从元组列表中返回具有最小 y 值的元组

编程里面元组和数组的区别是啥?

如何从具有子元组的元组创建列表?