リストを作成し、リストに含まれる数値の量を指定された値に増やす関数を作成するにはどうすればよいですか?
たとえば、最大値が 4 の場合、リストには以下が含まれます。
1, 2, 2, 3, 3, 3, 4, 4, 4, 4
私が探しているものを説明するのは難しいですが、例から理解できると思います!
ありがとう
リストを作成し、リストに含まれる数値の量を指定された値に増やす関数を作成するにはどうすればよいですか?
たとえば、最大値が 4 の場合、リストには以下が含まれます。
1, 2, 2, 3, 3, 3, 4, 4, 4, 4
私が探しているものを説明するのは難しいですが、例から理解できると思います!
ありがとう
私は使用しますitertools.chain
:
itertools.chain(*([i] * i for i in range(1, 5)))
またはitertools.chain.from_iterable
、もう少し怠惰に行うには:
itertools.chain.from_iterable([i] * i for i in range(1, 5))
そして、究極の怠惰のために、itertools.repeat
-- と組み合わせてください ( xrange
python2.x を使用している場合):
import itertools as it
it.chain.from_iterable(it.repeat(i, i) for i in range(1, 5))
関数として:
def lazy_funny_iter(n):
return it.chain.from_iterable(it.repeat(i, i) for i in range(1, n+1))
def lazy_funny_list(n):
return list(lazy_funny_iter(n))
ネストされたループ。これは非常に基本的な方法になります。はるかに良い方法があります。これで一般的なアイデアが得られるはずです。
>>> def listmaker(num):
l = []
for i in xrange(1, num+1):
for j in xrange(i):
l.append(i)
return l
>>> print listmaker(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
ここでは、リスト内包表記でそれを行っています:
>>> def listmaker2(num):
return [y for z in [[x]*(x) for x in xrange(1, num+1)] for y in z]
>>> print listmaker2(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
提案どおりに拡張を使用します。
>>> def listmaker3(num):
l = []
for i in xrange(1, num+1):
l.extend([i]*(i))
return l
>>> print listmaker3(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
再帰関数を使用できます。
def my_func(x):
if x <= 0:
return []
else:
return my_func(x-1) + [x] * x
>>> my_func(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
In [1]: def funny_list(n):
...: return sum(([i]*i for i in range(1, n+1)), [])
...:
In [2]: funny_list(4)
Out[2]: [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
itertools.chain
ただし、標準的な方法である とは異なり、これを実際のジェネレーターに変換することはできません。
問題に対する別の視点 (少し複雑ではありません):
>>> a = range(1,5)
>>> for i in range(2,5):
... a.extend(range(i,5))
...
>>> print sorted(a) #Remove the sort if you don't need it
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
示されているようにリストを作成するかなり直接的な方法は、
[i for i in range(1,n+1) for j in range(i)]
はn
、リストに表示される最大数です。上記は、以前に提案されたいくつかの回答で使用された方法と同等ですが、表現が少しきれいです。
これまでに述べたすべての方法に代わる方法i
は、リストの th 要素が の平方根の整数部分にほぼ等しいことに注意することです2*i
。わずかな調整により、次のように非常に単純なジェネレーターが可能になります。
def gen_nnlist(nmax):
n = 1
while n < nmax*(nmax+1):
yield int(n**.5+.5)
n += 2
Python 2.7.3 インタープリターでコードを実行した場合の出力例を次に示します。
>>> print [i for i in gen_nnlist(4)]
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>> print [i for i in gen_nnlist(6)]
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6]
>>> fun = gen_nnlist(3)
>>> for i in fun: print i
...
1
2
2
3
3
3
>>>
>>> list(''.join([str(x) * x for x in range(1, 5)]))
私はジェネレーターを使います:
>>> def growingSeq(maxN):
... for n in range(1,maxN+1):
... for _ in range(n):
... yield n
...
>>> growingSeq(4)
<generator object growingSeq at 0x1004db280>
>>> list(growingSeq(4))
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]