【问题标题】:Generate inverse sequence生成逆序列
【发布时间】:2014-02-06 21:56:32
【问题描述】:

我有一个序列

range(0,50,3)

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48]

这是我要生成的序列(每次不包括第 3 个元素),但能够以第 n 个数字开始和结束:

[1, 2, 4, 5, 7, 8, ...]

【问题讨论】:

  • 你能举一个更完整的例子来说明你想要什么吗?你说的逆是什么意思?
  • 它是我要生成的序列,即排除每个第 3 个元素 (range(0,50,1)-(range(0,50,3)),让我进行编辑
  • 你需要一个类范围序列或任意整数序列的逆吗?
  • 与其说是逆IMO,不如说是一种补充。

标签: python range


【解决方案1】:

这个怎么样:

def inv_range(start, stop, step):
  for val in range(start, stop):
    if (val - start) % step != 0:
      yield val

print list(inv_range(0,50,3))

打印出来

[1, 2, 4, 5, 7, 8, 10, 11, ...

附:如果您使用的是 Python 2,请将 range() 替换为 xrange() 以获得恒定内存解决方案。

【讨论】:

    【解决方案2】:

    构建一个您想要排除的数字的set,并在完整范围的列表推导中对其进行测试:

    >>> checkset = set(range(0, 50, 3))
    >>> [x for x in range(50) if x not in checkset]
    [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49]
    

    将列表转换为集合并不重要,但是当您所做的只是比较时,可以加快查找速度

    【讨论】:

    • 在理解之外构建集合,每次评估 if 语句时都会构建它。
    • 得知the hard way :-)
    【解决方案3】:

    对于这种特殊情况:

    [x for x in range(50) if x % 3]
    

    【讨论】:

      【解决方案4】:

      不是最有效的解决方案,但快速且易于理解

      excludes = range(0,50,3)
      others = [x for x in range(50) if x not in excludes]
      

      【讨论】:

        【解决方案5】:

        怎么样

        r = range(0,50)
        del r[::3]
        print r
        # [1, 2, 4, 5, 7, 8, ...]
        

        【讨论】:

          【解决方案6】:

          对于此类问题,有人会问“我怎样才能稍微修改 Python 内置函数的行为来执行 X?”我建议查看所述函数的 PyPy 实现,然后对其进行修改。

          在这种情况下,这里是 PyPy 的 range() and xrange() implementations

          我知道这不是一个简单的方法,但你可能会在这个过程中学到新的东西。

          基本上,您想要的是range() 的变体,它返回通常被跳过的值(即range() 的补码)。以range() 的实现为起点,看起来不需要太多工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-04
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 2022-11-05
            • 2013-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多