20

私にとってリスト内包表記は、正規表現が私にとって不透明な花崗岩のブロックのように思えます。ポインターが必要です。

たとえば、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"

本当に、私は両方を行う方法を知りたいです。

4

9 に答える 9

32

そのようです:

[ 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:
        ...
于 2008-09-19T17:28:14.087 に答える
7

それを試してください:

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))
于 2008-09-19T17:29:22.977 に答える
7

いくつかの選択肢があります。まず、新しいリストを作成し、各リストの内容をそれに追加できます。

li2 = []
for sublist in li:
    li2.extend(sublist)

itertools別の方法として、モジュールの関数を使用することもできます。このchain関数は、複数の iterable 内のすべてのアイテムを含む iterable を生成します。

import itertools
li2 = list(itertools.chain(*li))

このアプローチを採用すると、中間リストを作成せずに文字列を生成できます。

s = ",".join(itertools.chain(*li))
于 2008-09-19T17:26:51.187 に答える
4

私のお気に入り、そして最短のものはこれです:

li2 = sum(li, [])

s = ','.join(li2)

編集: ,sumの代わりに使用 ( Thomas Woutersreduceに感謝!)

于 2008-09-19T17:27:43.820 に答える
0
import itertools
itertools.flatten( li )
于 2008-09-19T17:24:56.760 に答える
0

フラット化されたリストにするには、次のいずれかを使用します。

  1. http://code.activestate.com/recipes/121294/
  2. http://code.activestate.com/recipes/363051/

次に、joinそれを文字列にします。

于 2008-09-19T17:26:44.247 に答える
0

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 つずつ処理するので便利です。 .

編集:面白い、私はそれを行う方法をたくさん学んでいます。それを行うための唯一の良い方法があると誰が言いましたか?

于 2008-09-19T17:26:52.107 に答える
0

この問題を解決するには多くの方法があります。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] を出力し、これを文字列に変換することもできます。

于 2008-10-28T19:17:27.197 に答える