2016-08-31 8 views
4

私は2つの値を交互に増やすべき整数のリストを作成しています。例えばPython:値を交互に増やす簡単な方法は?

、0から始まり20まで4と2との間で交互にすることになるだろう:

[0,4,6,10,12,16,18] 

範囲はxrangeだけインクリメント値の単一の整数を受け入れます。これを行う最も簡単な方法は何ですか?

答えて

12

私は手順を順番に簡単な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] 

利点は、つまりです(しかし、私は現時点でそれをうまく利用することは実際には考えられませんが、おそらくそうすることができます)。

+0

ありがとう、これは私が探していたものです。ステップのスケーリングは、実際に私のニーズに完璧です。 – isticism

+0

確かにニースのソリューション。 –

1
l = [] 
a = 0 
for i in xrnage (N) : 
    a += 2 
    if i&1 == 0 : 
     a+=2 
    l.append (a) 

見た目はシンプルです。

6

リスト内包とモジュラス演算子を使って、そのような巧妙なことを行うことができます。たとえば:

>>> [3*i + i%2 for i in range(10)] 
[0, 4, 6, 10, 12, 16, 18, 22, 24, 28] 
0

これは、柔軟性があり、どの範囲でも機能するソリューションです。

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] 
0

1組み合わせるステップサイズ6 3を0からnまでの数の別の範囲を生成する4 2ステップサイズで0からnまでの番号の範囲を生成両方リストとソート。重複を削除する

>>> 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] 
関連する問題