Pythonで100まで、一連の数字「1,2,5,6,9,10 ......」を生成するにはどうすればよいですか?コンマ( '、')を含める必要もありますが、これは主な問題ではありません。
シーケンス:1..100からのすべての数字、4で割り切れる余り1または2。
1,2,5,6,9,10 ...のすべての数値は、4で割り切れ、残りは1または2です。
>>> ','.join(str(i) for i in xrange(100) if i % 4 in (1,2))
'1,2,5,6,9,10,13,14,...'
>>> ','.join('{},{}'.format(i, i + 1) for i in range(1, 100, 4))
'1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'
それは迅速で非常に汚い解決策でした。
次に、さまざまな種類の進行問題に適したソリューションの場合:
def deltas():
while True:
yield 1
yield 3
def numbers(start, deltas, max):
i = start
while i <= max:
yield i
i += next(deltas)
print(','.join(str(i) for i in numbers(1, deltas(), 100)))
そして、これは itertools を使用して実装された同様のアイデアです:
from itertools import cycle, takewhile, accumulate, chain
def numbers(start, deltas, max):
deltas = cycle(deltas)
numbers = accumulate(chain([start], deltas))
return takewhile(lambda x: x <= max, numbers)
print(','.join(str(x) for x in numbers(1, [1, 3], 100)))
あなたが期待している正確なシーケンスに関するいくつかの推測を含みます:
>>> l = list(range(1, 100, 4)) + list(range(2, 100, 4))
>>> l.sort()
>>> ','.join(map(str, l))
'1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'
ワンライナーとして:
>>> ','.join(map(str, sorted(list(range(1, 100, 4))) + list(range(2, 100, 4))))
(ところで、これはPython 3互換です)
numpyとリストの理解を使用すると、
import numpy as np
[num for num in np.arange(1,101) if (num%4 == 1 or num%4 == 2)]
これは、増分ではなくリストのプロパティを活用することで機能します。
for num in range(1,100):
if num % 4 == 1 or num % 4 ==2:
n.append(num)
continue
pass
パターンを正しく推測したと仮定すると(1と3の増分を交互に)、これは望ましい結果を生成するはずです:
def sequence():
res = []
diff = 1
x = 1
while x <= 100:
res.append(x)
x += diff
diff = 3 if diff == 1 else 1
return ', '.join(res)
シーケンスが1から3の間で増分することを想定しています
numbers = [1]
while numbers[-1] < 100:
numbers.append(numbers[-1] + 1)
numbers.append(numbers[-1] + 3)
print ', '.join(map(str, numbers))
シーケンスが異なる場合、これを変更する方が簡単かもしれませんが、pokeまたはBlaXpiritは私のものよりも良い答えだと思います。