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 - 验证列表中的元组具有相同的长度的主要内容,如果未能解决你的问题,请参考以下文章