18

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

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リストを望む。これは本当に簡単だと思いますが、私はそれを見逃していますが、かなりの検索の後、私はあまり有用なものを思いつきませんでした。何か案は?

4

8 に答える 8

34

Python2.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では反復可能を返すことです(したがって、明示的にリストに変換する必要があります)。そして、リストを一緒に追加するために、+演算子を使用することができます。

于 2012-12-19T19:18:47.167 に答える
9

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

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

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

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

new_list = list(itertools.chain((-3,-1), 
                                xrange(1,6), 
                                tuple(7),  # make single element iterable
                                xrange(15,20)))
于 2012-12-19T19:18:24.127 に答える
3

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))

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

于 2012-12-19T19:17:18.810 に答える
2

range次のように値を解凍します。

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

print(new_list)
# [1, 2, 3, 4, 5, 15, 16, 17, 18, 19]

print(len(new_list))
# 10

print(type(new_list))
# <class 'list'>
于 2020-09-13T17:47:39.820 に答える
1

これを試して:

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]
于 2012-12-19T19:20:24.720 に答える
0

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

import operator
a = list(range(1,6))
b = list(range(7,9))
print(operator.concat(a,b))
于 2012-12-20T15:18:44.127 に答える
0

次のように範囲値を解凍するだけです。

>>> new_list = [*range(1,6),*range(15,20)]
>>> new_list
[1, 2, 3, 4, 5, 15, 16, 17, 18, 19]
>>> len(new_list)
10
于 2020-09-13T17:42:42.723 に答える
0

itertools.chain関数と解凍演算子(*)を使用できます

例1:

from itertools import chain

output = [*chain(range(1, 6), range(15, 20))]

例2:

from itertools import chain

data = [range(1, 6), range(15, 20)]
output = [*chain(*data)]

3chain.fromiterableを使用します:

data = [range(1, 6), range(15, 20)]
output = [*chain.from_iterable(data)]

出力

assert output == [1, 2, 3, 4, 5, 15, 16, 17, 18, 19]
于 2021-10-13T19:20:20.717 に答える