8

リストを作成し、リストに含まれる数値の量を指定された値に増やす関数を作成するにはどうすればよいですか?

たとえば、最大値が 4 の場合、リストには以下が含まれます。

1, 2, 2, 3, 3, 3, 4, 4, 4, 4

私が探しているものを説明するのは難しいですが、例から理解できると思います!

ありがとう

4

8 に答える 8

17

私は使用します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-- と組み合わせてください ( xrangepython2.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))
于 2012-11-05T16:32:27.550 に答える
16

ネストされたループ。これは非常に基本的な方法になります。はるかに良い方法があります。これで一般的なアイデアが得られるはずです。

>>> 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]
于 2012-11-05T16:27:10.807 に答える
9

再帰関数を使用できます。

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]
于 2012-11-05T16:40:39.173 に答える
7
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ただし、標準的な方法である とは異なり、これを実際のジェネレーターに変換することはできません。

于 2012-11-05T16:27:52.240 に答える
4

問題に対する別の視点 (少し複雑ではありません):

>>> 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]
于 2012-11-05T16:49:11.823 に答える
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
>>>
于 2012-11-05T17:40:53.307 に答える
3
>>> list(''.join([str(x) * x for x in range(1, 5)]))
于 2012-11-05T16:31:29.213 に答える
2

私はジェネレーターを使います:

>>> 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]
于 2012-11-05T19:00:06.220 に答える