【问题标题】:Accessing a tuple in enumerate?访问枚举中的元组?
【发布时间】:2018-10-03 10:10:26
【问题描述】:

我想遍历一个列表并对所有元素求和。除非,如果数字是 5,我想跳过 5 后面的数字。例如:

x=[1,2,3,4,5,6,7,5,4,3] #should results in 30

当我使用 enumerate 时,我只是不确定如何访问元组的索引。我想要做的是使用 if 语句,如果前一个索引处的数字 == 5,则继续循环。

谢谢你

【问题讨论】:

  • enumerate 为您提供索引和值。 for i, value in enumerate(x) 其中i 是索引
  • 你是什么意思你不能使用枚举访问三元组的索引? enumerate 返回 (index, value) 对的生成器。只需使用类似 for index, value in enumerate(obj) 的方式遍历 enumerate 返回的对象

标签: python list enumerate


【解决方案1】:

itertools documentation 有一个名为 pairwise 的秘诀。您可以复制粘贴该功能或从more_itertools(需要安装)导入它。

演示:

>>> from more_itertools import pairwise
>>> 
>>> x = [1,2,3,4,5,6,7,5,4,3]
>>> x[0] + sum(m for n, m in pairwise(x) if n != 5)
30

编辑:

但是如果我的数据结构是可迭代的,但不支持索引呢?

在这种情况下,上述解决方案需要稍作修改。

>>> from itertools import tee
>>> from more_itertools import pairwise
>>> 
>>> x = (n for n in [1,2,3,4,5,6,7,5,4,3]) # generator, no indices!
>>> it1, it2 = tee(x)
>>> next(it1, 0) + sum(m for n, m in pairwise(it2) if n != 5)
30

【讨论】:

    【解决方案2】:

    不喜欢得到支持的漏洞百出的单行代码。

    所以这是一个 for 循环的答案。

    x=[1,2,3,4,5,6,7,5,4,3, 5] #should results in 35. 
    
    s = 0
    for i, v in enumerate(x):
        if i != 0 and x[i-1] == 5: 
            continue 
        s += v
    
    print(s)
    

    【讨论】:

    • 我希望您单独评论每个有问题的 oneliner 而不是全部驳回。但您的解决方案是直截了当的,值得一票。
    【解决方案3】:

    sumenumerate 一起使用

    例如:

    x=[1,2,3,4,5,6,7,5,4,3]
    print(sum(v for i, v in enumerate(x) if (i == 0) or (x[i-1] != 5)))
    

    输出:

    30
    

    【讨论】:

      【解决方案4】:

      简单,详细的方式:

      SKIP_PREV = 5
      x = [1,2,3,4,5,6,7,5,4,3]
      prev = -1
      s = 0
      for num in x:
          if prev != SKIP_PREV:
              s += num
          prev = num
      print(s)
      # 30
      

      紧凑,可能不太清晰的方式:

      SKIP_PREV = 5
      x = [1,2,3,4,5,6,7,5,4,3]
      s = sum(num for i, num in enumerate(x) if i == 0 or x[i - 1] != SKIP_PREV)
      print(s)
      # 30
      

      【讨论】:

        【解决方案5】:

        如果您乐于使用第 3 方库,您可以使用带有整数索引的 NumPy:

        import numpy as np
        
        x = np.array([1,2,3,4,5,6,7,5,4,3])
        
        res = x.sum() - x[np.where(x == 5)[0]+1].sum()  # 30
        

        另见What are the advantages of NumPy over regular Python lists?

        【讨论】:

          【解决方案6】:

          您可以将列表与其自身的移位版本配对。这应该有效:

          sum(val for (prev, val)
              in zip(itertools.chain((None,), x), x)
              if prev != 5 )
          

          【讨论】:

            【解决方案7】:

            迄今为止最长的代码。反正不用枚举,就是一个简单的FSM

            x = [1,2,3,4,5,6,7,5,4,3]
            skip = False
            s = 0 
            for v in x:
                if skip:
                    skip = False
                else:
                    s += v
                    skip = v == 5
            print(s)
            

            【讨论】:

              猜你喜欢
              • 2016-09-27
              • 2011-07-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-29
              • 1970-01-01
              • 2019-05-14
              相关资源
              最近更新 更多