2016-11-28 85 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 ,:]在範圍(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深列表的第一個元素包含在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元素的列表,所以包裝這些每一個成它自己的列表,例如下一個元素是:

>>> [[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[i]listD只是元素:

[[[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