web-dev-qa-db-ja.com

Python複数の範囲ステートメントを使用したリストの初期化

例として[1,2,3,4,5,15,16,17,18,19]のような1つの長いリストが必要です。これを初期化するには、次のように入力してみます。

new_list = [range(1,6),range(15,20)]

しかし、これは私が望むことをしません、戻ります:

[[1, 2, 3, 4, 5], [15, 16, 17, 18, 19]]

私がする時:

len(new_list)

必要な10個の要素ではなく2個を返します(リスト内に2つのリストを作成したため)。明らかに、この例では、必要なものを入力するだけで済みますが、次のような奇妙な反復リストに対してこれを実行しようとしています。

new_list = [range(101,6284),8001,8003,8010,range(10000,12322)]

リストのリスト(またはそれが最もよく呼ばれるもの)の代わりに1-Dリストを望む。これは本当に簡単で、見落としていると思いますが、かなりの検索を行った結果、あまり便利なものは何も見つかりませんでした。何か案は?

15
jackd

Python 2.x:

 range(1,6) + range(15,20)

または、Python3.xを使用している場合は、次のことを試してください。

list(range(1,6)) + list(range(15,20))

中間の要素を処理する場合、Python 2.x:

range(101,6284) + [8001,8003,8010] + range(10000,12322)

そして最後に、その間の要素を処理するために、Python 3.x:

list(range(101,6284)) + [8001,8003,8010] + list(range(10000,12322))

ここで覚えておくべき重要な側面は、Python 2.x rangeはリストを返し、Python 3.xは、反復可能を返すことです。 (したがって、明示的にリストに変換する必要があります)。また、リストを一緒に追加するには、+演算子を使用できます。

22
Óscar López

itertools.chain を使用して、range()呼び出しの出力をフラット化できます。

_import itertools
new_list = list(itertools.chain(xrange(1,6), xrange(15,20)))
_

xrange(またはpython3の場合は単にrange())を使用して反復可能を取得し、それらをチェーン化すると、1つのリストオブジェクトのみが作成されます(中間リストは必要ありません)。

中間値を挿入する必要がある場合は、チェーンにリスト/タプルを含めるだけです。

_new_list = list(itertools.chain((-3,-1), 
                                xrange(1,6), 
                                Tuple(7),  # make single element iterable
                                xrange(15,20)))
_
8
Shawn Chin

rangeは最初にリストを返すため、それらを_+_と連結するか、append()またはextend()を使用する必要があります。

_new_list = range(1,6) + range(15,20)
_

または

_new_list = range(101,6284)
mew_list.extend([8001,8003,8010])
mew_list.extend(range(10000,12322))
_

または、Shawn Chinの回答に示されているように、itertools.chain()を使用することもできます。

2
Silas Ray

これを試して:

from itertools import chain

new_list = [x for x in chain(range(1,6), range(15,20))]
print new_list

希望どおりの出力:

 [1、2、3、4、5、15、16、17、18、19] 
1
jackcogdill

+のないバージョンを提案したい

import operator
a = list(range(1,6))
b = list(range(7,9))
print(operator.concat(a,b))
0
Mikhail