2016-11-28 8 views
4

をスライス:は、私は次のような多次元変数の長さを持つ多次元リスト

listD = [[[[53, 54], [129, 130]]], 
    [[[51, 51], [132, 132]]], 
    [[[39, 39], 
     [144, 144]], 
     [[53, 54], 
     [129, 130]]], 
    [[[39, 39], [146, 146]], [[54, 54], [130, 130]]], 
    [[[54, 53], [130, 129]]], 
    [[[52, 52], [132, 132]]] 
    ] 

私は、リストの最も内側のそれぞれの最初の要素を選択する必要があります。出力は次のようになります。

outlist=[[[[53, 54]]], 
    [[[51, 51]]], 
    [[[39, 39]], 
     [[53, 54]]], 
    [[[39, 39]], 
     [[54, 54]]], 
    [[[54, 53]]], 
    [[[52, 52]]] 
    ] 

私は0を使用してスライスしようとしています。s、私は戻って右のリストを取得しておりません。どのようにこれを行うにはPython?

私のアウトリストに誤りがありました。私はリストを編集しました。混乱させて申し訳ありません。

+3

あなたがこれまで行ってきたものをご提示ください。 –

+2

リストの理解を避けたい場合は、numpyを調べることができます。 – Shadowen

+0

リストの理解度を使用したいと思います。これまでは、リストを配列に変換したあと、 'outlist = [listD [n] [:、0 ,:]をrange(8)]'に使用しようとしました。これは、インデックスの整数の代わりにタプルを使用しているというタイプエラーを私に与えます。エラーは理にかなっていますが、修正方法はわかりません。 –

答えて

-1

あなたが使用することができます。

temp=[item for sublist in listD for item in sublist] 
flatten=[item for sublist in temp for item in sublist]  
[flatten[int(i*2)] for i in xrange(int(len(flatten)/2))] 

を取得するには:

[[53, 54], 
[51, 51], 
[39, 39], 
[53, 54], 
[39, 39], 
[54, 54], 
[54, 53], 
[52, 52]] 

かを:

[[[flatten[int(i*2)]]] for i in xrange(int(len(flatten)/2))] 

は、あなたが書いたように、それは入れ子に取得します。

+0

フラットリストは、特定のアイテムのインデックスはイン側のリストです。リストは非常に可変であり、内側のリストは2または3または5またはnの長さであってもよい。 –

-1

これを試してみてください:

res_list = [] 

for item in listD: 
    sub_list = [] 
    for i in item: 
     sub_list.append([i[0]]) 
    res_list.append(sub_list) 

出力:リスト内包して

>>> res_list 
[[[[53, 54]]], [[[51, 51]]], [[[39, 39]], [[53, 54]]], [[[39, 39]], [[54, 54]]], [[[54, 53]]], [[[52, 52]]]] 

、あなたが試すことができます:

res_list = [[[i[0]] for i in item] for item in listD] 
+0

私はdownvoteがなぜ理解できますか? – ettanany

1

をネストされたリスト内包して試してみてください。

を段階的に
[[[x[0]] for x in y] for y in listD] 

あなたlistDの各ネストされた行を見て、それがoutlistに対応する方法を参照してください。あなたは1-深いリストのそれぞれの第1要素はoutlist

>>> [x[0] for x in listD[0]] 
[[53, 54]] 
>>> [x[0] for x in listD[1]] 
[[51, 51]] 
>>> [x[0] for x in listD[2]] 
[[39, 39], [53, 54]] 

に含まれている。しかしoutlistに、これらのリストは、その後、1より1要素のリストにネストされていることがわかり、これにこれらのそれぞれをラップすることができますそれは、次の要素は次のようになります例えば、自分のリストです:

>>> [[x[0] for x in listD[3]]] 
[[[39, 39], [54, 54]]] 

その後、listDの各インデックスのためにそれを拡張:

[[[x[0]] for x in listD[i]] for i in range(len(listD))] 

を、その後replacinことにより、さらに簡素化listDだけの要素を持つグラムlistD[i]

[[[x[0]] for x in y] for y in listD] 
+0

なぜdownvoteですか?質問の 'listD'を考えると、この答えは正確な' outlist'を与えます... – Billy

+0

誰がこれを投票しているのか分からない、これは私を大いに助けます。お返事ありがとうございます。 –

+0

あなたは歓迎です。 – Billy

1

リストのリストが均一な深さを有するか否かは不明です。それが深度が可変であれば、これは再帰的に最も接近しています。

は考える:

>>> listD = [[[[53, 54], [129, 130]]], 
...  [[[51, 51], [132, 132]]], 
...  [[[39, 39], 
...  [144, 144]], 
...  [[53, 54], 
...  [129, 130]]], 
...  [[[39, 39], [146, 146]], [[54, 54], [130, 130]]], 
...  [[[54, 53], [130, 129]]], 
...  [[[52, 52], [132, 132]]] 
...  ] 
>>> 
>>> outlist=[[[[53, 54]]], 
...  [[[51, 51]]], 
...  [[[39, 39]], 
...  [[53, 54]]], 
...  [[[39, 39]], 
...  [[54, 54]]], 
...  [[[54, 53]]], 
...  [[[52, 52]]] 
...  ] 

あなたが最初の要素に何のリストを持っていないリストを見つけるまで、あなたが再帰的にリストのリストをトラバースすることができます。それを保つ。それ以外の場合は、ネスティングを増やします。

例:

def trav(x): 
    result = [] 
    for el in x: 
     if isinstance(el, list) and any(isinstance(e, list) for e in el[0]): 
      result.append(trav(el)) 
     else: 
      result.append([el[0]]) 
    return result 


>>> trav(listD) 
[[[[53, 54]]], [[[51, 51]]], [[[39, 39]], [[53, 54]]], [[[39, 39]], 
[[54, 54]]], [[[54, 53]]], [[[52, 52]]]] 
>>> trav(listD)==outlist 
True 
+0

なぜ投票が遅れましたか? – dawg

関連する問題