Python 生成逆序列
我有一个序列Python 生成逆序列,python,range,Python,Range,我有一个序列 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, ...] 这个怎么样: def inv_range(start, stop, step): for val in range(start, stop): if (val - start) % s
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, ...]
这个怎么样:
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()
,以获得一个恒定内存解决方案。构建一个集合
,设置要排除的数字,并在完整范围的列表理解中进行测试:
>>> 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]
将列表转换为集合并不重要,但当您所做的只是比较时,可以加快查找速度这不是最有效的解决方案,而是快速且易于理解的解决方案
excludes = range(0,50,3)
others = [x for x in range(50) if x not in excludes]
怎么样
r = range(0,50)
del r[::3]
print r
# [1, 2, 4, 5, 7, 8, ...]
对于这种特殊情况:
[x for x in range(50) if x % 3]
对于这样的问题,如果有人问“我怎样才能稍微修改Python内置函数的行为来执行X?”我建议查看该函数的PyPy实现,然后修改它 在这种情况下,这里是PyPy的 我意识到这不是一条简单的出路,但在这个过程中你可能会学到一些新东西
基本上,您需要的是
range()
的一个变体,它返回通常跳过的值(即range()
的补码)。使用range()
的实现作为起点,看起来不需要太多工作。您能给出一个更完整的示例来说明您想要什么吗?你所说的逆是什么意思?它是我想要生成的序列,即排除每三个元素(range(0,50,1)-(range(0,50,3)
),让我做一个编辑你需要一个类似范围序列的逆序列还是一个任意整数序列的逆序列?它更像是一个补码,而不是逆序列。在理解之外构建集合,每次对if
语句求值时,你都在构建它。了解到其中一个:-)