【问题标题】:Python -- validate tuples in a list have the same lengthPython - 验证列表中的元组具有相同的长度
【发布时间】: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 循环?

【问题讨论】:

    标签: python arrays list loops for-loop


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多