リスト内包表記を使用して Python の 2D 配列を 1 つの文字列にマージするにはどうすればよいですか?
-
01-07-2019 - |
質問
私にとってリスト内包表記は、正規表現が私にとって不透明な花崗岩の塊のようなものであるように思えます。ポインタが必要です。
たとえば、2D リストがあるとします。
li = [[0,1,2],[3,4,5],[6,7,8]]
これを1つの長いリストにマージしたいと思います
li2 = [0,1,2,3,4,5,6,7,8]
または区切り文字を含む文字列に変換します。
s = "0,1,2,3,4,5,6,7,8"
本当に、両方を行う方法を知りたいです。
解決
そのようです:
[ item for innerlist in outerlist for item in innerlist ]
それを区切り文字を含む文字列に直接変換します。
','.join(str(item) for innerlist in outerlist for item in innerlist)
はい、「for innerlist in innerlist」と「for item in innerlist」の順序は正しいです。ループの「本体」が listcomp の先頭にある場合でも、ネストされたループ (および「if」句) の順序は、ループを書き出すときと同じです。
for innerlist in outerlist:
for item in innerlist:
...
他のヒント
それを試してみてください:
li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]
次のように読むことができます。
すべてのyのリストを教えてください。
ys は xs から来ています。
xsはliから来ています。
それを文字列にマッピングするには、次のようにします。
','.join(map(str,li2))
いくつかの選択肢があります。まず、新しいリストを作成し、各リストの内容をそれに追加します。
li2 = []
for sublist in li:
li2.extend(sublist)
代わりに、 itertools
モジュールの chain
この関数は、複数の反復可能オブジェクト内のすべての項目を含む反復可能オブジェクトを生成します。
import itertools
li2 = list(itertools.chain(*li))
このアプローチを採用すると、中間リストを作成せずに文字列を生成できます。
s = ",".join(itertools.chain(*li))
私のお気に入りで、最も短いものは次のとおりです。
li2 = sum(li, [])
そして
s = ','.join(li2)
編集:使用 sum
の代わりに reduce
, 、 (ありがとう トーマス・ウーターズ!)
フラット化されたリストにするには、次のいずれかを使用します。
それから、 join
それを文字列にします。
2 番目の場合、それを行うための組み込みの文字列メソッドがあります。
>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"
最初の場合は、内包リスト内で結合を使用できます。
>>> print ",".join([",".join(str(x) for x in li])
"0,1,2,3,4,5,6,7,8"
ただし、 itertools. flatten を使用する方が簡単です。
>>> import itertools
>>> print itertools.flatten(li)
[0,1,2,3,4,5,6,7,8]
>>> print ",".join(str(x) for x in itertools.flatten(li))
"0,1,2,3,4,5,6,7,8"
注:itertools は、リスト、タプル、文字列などのイテレータを使用した一般的なタスクの処理に役立つモジュールです。作業中の構造のコピーを保存するのではなく、項目を 1 つずつ処理するので便利です。
編集 :面白いことに、私はそれを行う方法をたくさん学んでいます。それを行うための良い方法が 1 つしかないなどと誰が言いましたか?
この問題を解決する方法はたくさんあります。好き ナンピーのツールは、通常、私が行うすべての作業にすでにインポートされているためです。ただし、Numpy を他の目的で使用していない場合、これはおそらく良い方法ではありません。
import numpy
li = [[0,1,2],[3,4,5],[6,7,8]]
li2=li[0] #first element of array to merge
i=1
while i<len(li):
li2=numpy.concatenate((li2,li[i]))
i+=1
print li2
これにより [0 1 2 3 4 5 6 7 8] が出力され、これを文字列に変換することもできます。
import itertools
itertools.flatten( li )