2017-04-11 7 views
1

私は、文字列とリストのリストのリストを持っているを残しながらリストを平坦化する方法を、次のようなもの)(章、段落、テキストの文章を表す):(Pythonで)いくつかのネスト

[ [[ ['chp1p1s1'], ['chp1p1s2'], ['chp1p1s3'] ], 
    [ ['chp1p2s1'], ['chp1p2s2'], ['chp1p2s3'] ]], 
    [[ ['chp2p1s1'], ['chp2p1s2'], ['chp2p1s3'] ], 
    [ ['chp2p2s1'], ['chp2p2s2'], ['chp2p2s3'] ]] ] 

I最終的にはこのように見えるように、([x for y in z for x in y]によって例えば)completlyこのリストを平坦化する方法を知っているが、私は何をしたいのは、部分的にそれを平らにすることです:

[ [ ['chp1p1s1'], ['chp1p1s2'], ['chp1p1s3'], 
    ['chp1p2s1'], ['chp1p2s2'], ['chp1p2s3'] ], 
    [ ['chp2p1s1'], ['chp2p1s2'], ['chp2p1s3'], 
    ['chp2p2s1'], ['chp2p2s2'], ['chp2p2s3'] ] ] 

私はループのためのいくつかによってこの問題を解決するために管理:

semiflattend_list=list() 
for chapter in chapters: 
    senlist=list() 
    for paragraph in chapter: 
     for sentences in paragraph: 
      senlist.append(sentences) 
    semiflattend_list.append(senlist) 

しかし、より良い、より短い解決策があるのだろうか? (私は私のリストのサイズが異なるためzipは、移動するための方法である、とは思わない)

+1

例は実際に私はあなたが何を意味するのかであるとは思わない二つの異なるリストのタプルです。かっこやカンマを台無しにしているかもしれませんが、再現性のある例が必要です –

答えて

1

私が見ることができる最も簡単な変更はitertools.chain方法使用している:何をするか、そう

q = [ 
    [[ ['chp1p1s1'], ['chp1p1s2'], ['chp1p1s3'] ], 
     [ ['chp1p2s1'], ['chp1p2s2'], ['chp1p2s3'] ]], 
    [[ ['chp2p1s1'], ['chp2p1s2'], ['chp2p1s3'] ], 
     [ ['chp2p2s1'], ['chp2p2s2'], ['chp2p2s3'] ]] 
    ] 

r = [list(itertools.chain(*g)) for g in q] 
print(r) 

[[['chp1p1s1'], ['chp1p1s2'], ['chp1p1s3'], ['chp1p2s1'], ['chp1p2s2'], ['chp1p2s3']], 
[['chp2p1s1'], ['chp2p1s2'], ['chp2p1s3'], ['chp2p2s1'], ['chp2p2s2'], ['chp2p2s3']]] 

[list(itertools.chain(*g)) for g in q]平均:あなたが与えた

# If I only had this 
[g for g in q] 
# I would get the same I started with. 
# What I really want is to expand the nested lists 

# * before an iterable (basically) converts the iterable into its parts. 
func foo(bar, baz): 
    print(bar + " " + baz) 

lst = ["cat", "dog"] 
foo(*lst) # prints "cat dog" 

# itertools.chain accepts an arbitrary number of lists, and then outputs 
# a generator of the results: 
c = itertools.chain([1],[2]) 
# c is now <itertools.chain object at 0x10e1fce10> 
# You don't want an generator though, you want a list. Calling `list` converts that: 
o = list(c) 
# o is now [1,2] 
# Now, together: 
myList = [[2],[3]] 
flattened = list(itertools.chain(*myList)) 
# flattened is now [2,3] 
+0

これは実際にそれを解決しました!多分このアスタリスク/スプラット演算子を説明していただけますか? [doc](https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists)では、ここでどのように役立つのか説明していません。 – dia

関連する問題