【问题标题】:Python: count until element in list is a tuplePython:计数直到列表中的元素是一个元组
【发布时间】:2014-02-15 06:01:53
【问题描述】:

我有一个这样的列表:

MyList = [2,3,(1,2),5]

其中元素 0、1 和 3 是整数,而元素 2 是元组。我想创建一个计数器,它告诉我列表中有多少元素在元组出现之前。 在示例中,我想要一个计数器,其值为 2(第一个元组之前的 2 个元素,2 和 3)。我尝试了以下方法:

counter = 0
while MyList[counter] is not tuple: 
    counter = counter + 1

但它不起作用,因为当它评估语句“(1,2) 不是元组”而不是引发 False 时,它​​会继续取值 True。知道问题可能是什么以及如何解决它吗?谢谢。

【问题讨论】:

  • 试试isinstancetype(MyList[counter]

标签: python list python-2.7 tuples


【解决方案1】:

使用isinstance()判断对象的类型:

>>> counter = 0
>>> while not isinstance(MyList[counter], tuple):
...     counter += 1
...
>>> counter
2

【讨论】:

    【解决方案2】:

    您可以使用for 循环和break 输出:

    counter = 0
    for elem in MyList:
        if isinstance(elem, tuple):
            break
        counter += 1
    

    或者,使用enumerate()

    for counter, elem in enumerate(MyList):
        if isinstance(elem, tuple):
            break
    
    # counter *could* be unbound if `MyList` is empty
    

    或者你可以使用itertools.takewhile():

    from itertools import takewhile
    
    counter = sum(1 for elem in takewhile(lambda e: not isinstance(e, tuple), MyList))
    

    后一种方法的演示:

    >>> from itertools import takewhile
    >>> MyList = [2,3,(1,2),5]
    >>> sum(1 for elem in takewhile(lambda e: not isinstance(e, tuple), MyList))
    2
    

    【讨论】:

      【解决方案3】:
      for i, e in enumerate([2,3,(1,2),5]):
        if isinstance(e, tuple):
          break
      print i
      

      实际上,这是find() 用例的另一个示例。不幸的是,Python 没有提供开箱即用的功能。有了它就可以了:

      return find(lambda e: isinstance(e, tuple), [2,3,(1,2),5])
      

      【讨论】:

        【解决方案4】:

        只需使用生成器。它是你能拥有的最简单的。

        next(index for index, elem in enumerate(MyList) if isinstance(elem, tuple))
        

        【讨论】:

        • 我不知道...为此创建一个新列表?
        • @TimPietzcker:可以在生成器上使用 Sum 吗?
        • 嗯,这就是 Martijn 的答案。
        • @TimPietzcker:我猜你可能会喜欢我的新答案
        • 确实如此。它本身可能有点太聪明了,我永远不会在实践中使用它(我敢打赌,如果你在半年后看到它,你不会知道它应该做什么),但它很有趣。
        【解决方案5】:
        cnt = 0
        elem = MyList[cnt]
        while isinstance(elem, int):
          cnt+= 1
          elem = MyList[cnt]
        return cnt
        

        【讨论】:

          【解决方案6】:

          另一种(可能更简单)的方法是:

          MyList = [2,3,(1,2),5]
          counter=0
          for i in MyList:
              if type(i) == tuple:
                  break
              counter+=1
          print(counter)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-25
            • 2016-12-19
            • 2012-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多