40990


python3にて，例えばN=3, M=4として，

[code]

    l = [1,1,1,2,2,2,3,3,3,4,4,4]
    
[/code]

みたいなリストを作成したいと考えています．  
(1がN個, 2がN個, ..., MがN個)

このようなリストを作成する最も短いコードを教えていただきたいです．現在は

[code]

    l = list(chain.from_iterable([[i]*N for i in range(1, M+1)]))
    
[/code]

と書いています．一度間違った階層構造のリストを作ってからflattenしているのが気持ち悪いのですが，これより短く記述するのは難しいでしょうか．


CC BY-SA 3.0
2018-01-16T00:51:32.540
40978
2018-01-16T03:48:02.407
2018-01-16T01:04:06.550
3060
27006
question
python python3
[1,1,1,2,2,2,3,3,3,4,4,4]みたいなリストを作成したい

[code]

    l = [i // n + 1 for i in range(n * m)]
    
[/code]

で。

[code]

    >>> m = 4
    >>> n = 3
    >>> l = [i // n + 1 for i in range(n * m)]
    >>> l
    [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
    >>> m = 5
    >>> n = 4
    >>> l = [i // n + 1 for i in range(n * m)]
    >>> l
    [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5]
    
[/code]


CC BY-SA 3.0
2018-01-16T02:03:07.103
40984
2018-01-16T02:03:07.103
12274
40978
answer


内包表記2段でどうでしょう。

[code]

    >>> M = 4
    >>> N = 3
    >>> [x+1 for x in range(M) for y in range(N)]
    [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
    
[/code]

おまけ。

itertools.chain_from_iterable を使う例

[code]

    >>> list(itertools.chain.from_iterable([[x+1]*N for x in range(M)]))
    [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
    
[/code]

itertools.product を使う例

[code]

    >>> import itertools
    >>> [x+1 for x,y in itertools.product(range(M), range(N))]
    [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
    
[/code]


CC BY-SA 3.0
2018-01-16T03:48:02.407
40990
2018-01-16T03:48:02.407
806
40978
answer