2016-11-28 87 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