私にとってリスト内包表記は、正規表現が私にとって不透明な花崗岩のブロックのように思えます。ポインターが必要です。
たとえば、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"
本当に、私は両方を行う方法を知りたいです。
私にとってリスト内包表記は、正規表現が私にとって不透明な花崗岩のブロックのように思えます。ポインターが必要です。
たとえば、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 outerlist」と「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]
次のように読むことができます:
すべての ys のリストをください。
ys は xs から来ています。
xs は li に由来します。
それを文字列にマップするには:
','.join(map(str,li2))
いくつかの選択肢があります。まず、新しいリストを作成し、各リストの内容をそれに追加できます。
li2 = []
for sublist in li:
li2.extend(sublist)
itertools
別の方法として、モジュールの関数を使用することもできます。このchain
関数は、複数の iterable 内のすべてのアイテムを含む iterable を生成します。
import itertools
li2 = list(itertools.chain(*li))
このアプローチを採用すると、中間リストを作成せずに文字列を生成できます。
s = ",".join(itertools.chain(*li))
私のお気に入り、そして最短のものはこれです:
li2 = sum(li, [])
と
s = ','.join(li2)
編集: ,sum
の代わりに使用 ( Thomas Woutersreduce
に感謝!)
import itertools
itertools.flatten( li )
フラット化されたリストにするには、次のいずれかを使用します。
次に、join
それを文字列にします。
2 つ目については、それを行う組み込みの文字列メソッドがあります。
>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"
最初のものについては、理解リスト内で join を使用できます:
>>> 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 つずつ処理するので便利です。 .
編集:面白い、私はそれを行う方法をたくさん学んでいます。それを行うための唯一の良い方法があると誰が言いましたか?
この問題を解決するには多くの方法があります。Numpyのツールは、通常、私が行うすべての作業で既にインポートされているため、気に入っています。ただし、他に 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] を出力し、これを文字列に変換することもできます。