【发布时间】:2017-01-07 13:34:43
【问题描述】:
我正在构建一个整数列表,应该以 2 个交替值递增。
例如,从 0 开始并在 4 和 2 之间交替直到 20 会:
[0,4,6,10,12,16,18]
range 和 xrange 只接受一个整数作为增量值。最简单的方法是什么?
【问题讨论】:
我正在构建一个整数列表,应该以 2 个交替值递增。
例如,从 0 开始并在 4 和 2 之间交替直到 20 会:
[0,4,6,10,12,16,18]
range 和 xrange 只接受一个整数作为增量值。最简单的方法是什么?
【问题讨论】:
我可能会使用一个简单的itertools.cycle 来循环执行这些步骤:
from itertools import cycle
def fancy_range(start, stop, steps=(1,)):
steps = cycle(steps)
val = start
while val < stop:
yield val
val += next(steps)
你可以这样称呼它:
>>> list(fancy_range(0, 20, (4, 2)))
[0, 4, 6, 10, 12, 16, 18]
这里的优点是可以很好地扩展到任意数量的步骤(虽然我现在真的想不出有什么好的用途——但也许你可以)。
【讨论】:
您可以使用列表推导和模运算符来做类似的聪明事情。例如:
>>> [3*i + i%2 for i in range(10)]
[0, 4, 6, 10, 12, 16, 18, 22, 24, 28]
【讨论】:
l = []
a = 0
for i in xrnage (N) :
a += 2
if i&1 == 0 :
a+=2
l.append (a)
对我来说看起来很简单。
【讨论】:
这可能是一种灵活且适用于任何范围的解决方案。
def custom_range(first, second, range_limit):
start , end = range_limit
step = first + second
a = range(start, end, step)
b = range(first, end, step)
from itertools import izip_longest
print [j for i in izip_longest(a,b) for j in i if j!=None]
custom_range(4,2,(0,19))
custom_range(6,5,(0,34))
输出:
[0, 4, 6, 10, 12, 16, 18]
[0, 6, 11, 17, 22, 28, 33]
【讨论】:
1 生成从 0 到 n 的数字范围,步长为 4 2 生成另一个从 0 到 n 的数字范围,步长为 6 3 合并列表和排序。删除重复项
>>> a = range(0,20,4)
>>> a
[0, 4, 8, 12, 16]
>>> b = range(0,20,6)
>>> c = sorted(a + b)
>>> b
[0, 6, 12, 18]
>>> c
[0, 0, 4, 6, 8, 12, 12, 16, 18]
>>> c = list(set(c))
>>> c
[0, 4, 6, 8, 12, 16, 18]
【讨论】: