49712


下記のようなリストをrangeで１行でどのように作ればよいのでしょうか？  
`[98, 99, 1, 2, 3]`

`[i for i in range(98, 3)]`だと空のリストになってしまいます。  
`[98, 99]`と`[1,2,3]`をそれぞれ作ってマージすれば作れることはわかっているのですが、上記のようにリスト内包表記で１行で書けないでしょうか。


CC BY-SA 4.0
2018-10-27T09:11:35.403
49705
2018-10-27T16:30:01.023
25909
question
python python3
pythonのrangeについて


内包表記1つだと厳しい気がします。  
内包表記2つ使えばなんとかいけるかと思います。

[code]

     new_list = [i for i in range(98,100)] + [i for i in range(1,4)]
    
[/code]


CC BY-SA 4.0
2018-10-27T10:03:31.827
49707
2018-10-27T10:03:31.827
29506
49705
answer


> rangeを使って１～９９の間で循環させる方法

数学的には「99で割った剰余 + 1」で表現できます。

[code]

    start = 98
    num = 5
    li = [1 + ((n - 1) % 99) for n in range(start, start + num)]
    # li == [98, 99, 1, 2, 3]
    
[/code]


CC BY-SA 4.0
2018-10-27T15:33:21.997
49712
2018-10-27T15:33:21.997
49
49705
answer


### イテレーション可能な物の結合

例えばchamponさんの回答のように、`range` を繋げるには、一度リストにして `+`
する以外に、[itertools.chain](https://docs.python.jp/3/library/itertools.html?#itertools.chain)
を使う方法もあります。

[code]

    [i for i in itertools.chain(range(98, 99+1), range(1, 3+1))]
    
[/code]

より汎用的には、例えば
[itertools.islice](https://docs.python.jp/3/library/itertools.html?#itertools.islice)や[itertools.cycle](https://docs.python.jp/3/library/itertools.html?#itertools.cycle)と組み合わせ、

[code]

    #!/usr/bin/python3
    import itertools
    
    start = 98
    end = 3
    max_num = 99
    
    # 必要な要素数: 今回は最終値(end)などから求め、5個になる
    num = end - start + 1 + (end < start and max_num)
    
    result = [i for i in itertools.islice(
        itertools.chain(
            range(start, max_num + 1),
            itertools.cycle(range(1, max_num + 1))
        ),
        num,
    )]
    # result は [98, 99, 1, 2, 3] 
    
[/code]

のように書けます。`[i for i in foo_bar]` は `list(foo_bar)` でもよいです。内包表記ではなくなってしまいますが。


CC BY-SA 4.0
2018-10-27T15:33:56.610
49713
2018-10-27T16:30:01.023
2018-10-27T16:30:01.023
3054
3054
49705
answer