2017-08-28 38 views
1

这里是我的代码:的Python - 验证列表中的元组具有相同的长度

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循环?

回答

5

您可以使用all()

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

你从冗余部部得到一个警告!切勿使用if/else来输出True或False。 ) –

+2

我同意,但我可能错误地认为OP有2个逻辑分支,只是为MCVE打印 - 但他明确要求打印。我会更新,但@DanilSperansky有单线报道。 – AChampion

0

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

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

我其实很喜欢这种方法。最好在创建数据结构时强制格式化数据结构,而不是在每次使用它时都要检查它。 – mgilson

5

这里是一个班轮:

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

我非常确定,如果我拥有“全部”版本,我就不会使用'set'版本。具体而言,'all'更清晰,并且一旦发现长度错误的元组就会短路。在决定之前,'set'版本'总是会查看_every_元组。 – mgilson

+0

@mgilson你是对的 –

+0

@JoelLawZiYang考虑接受其中一个答案 –

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) 

虽然有些多余,这个解决方案非常可读。

+0

如此多的代码和较慢的列表理解和所有使用() – Y0da

+0

@ Y0da我试图去与OP的“调整for循环“而不是完全拆除所有内容并制作一行代码。但是,如果没有提到前面提到的“调整”,使用list comp + all()仍然是更好的解决方案。 – Jerrybibo

+0

我得到了动力,但在我看来,这是不可读的比较列表comp + all()这是更pythonic更方便。这种答案(@ danil-speransky)帮助每个人变得更加pythonic并且写出更好的代码=) – Y0da

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 
+0

Apologies.misread the q。纠正它。 – akp

相关问题