切片多维列表

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
请展示你目前为止已经完成了什么。 - Karan Nagpal
2
如果您想避免列表推导,您可能需要了解一下NumPy... - Shadowen
我想使用列表推导式。目前为止,我尝试将列表转换为数组后使用以下代码:outlist = [listD[n][:,0,:] for n in range(8)]。但是,这给了我一个类型错误,说我使用了一个元组而不是整数索引。这个错误是有道理的,但我不知道如何修复它。 - Ramesh Ramasubramanian
你在使用numpy吗? - dawg
@RameshRamasubramanian,为什么输出结果有深度嵌套的列表?难道你不想得到像[[53, 54], [51, 51], ...]这样简单的列表吗? - RomanPerekhrest
显示剩余7条评论
5个回答

3
尝试使用嵌套列表推导式:

尝试使用嵌套列表推导式:

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

然后通过将listD[i]替换为listD中的元素来进一步简化:

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

为什么要点踩?鉴于问题中给出了listD,此答案给出了确切的outlist... - Billy
不确定是谁在给这个点踩,但这确实对我很有帮助。谢谢。 - Ramesh Ramasubramanian

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

这是我最近编写的一个扁平化函数,它可以接受任意数量的维度:

def get_dims(data):
    if not isinstance(data, (list, tuple)):
        return 0
    return get_dims(data[0]) + 1
def flatten(data, depth = 0):
    if get_dims(data) == depth:
        return [data]
    elif get_dims(data) == depth + 1:
        return list(data)
    return sum([flatten(v, depth) for v in data], [])

depth参数用于保留一些子列表,如果用户需要的话。这在以下情况下非常有用:

print([x[0] for x in flatten(listD, 1)])

-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))]

要像你写的那样嵌套它。


扁平化的列表不能正常工作,因为我的后续操作需要获取特定项在列表中的索引。该列表高度可变,内部列表可能是2、3、5或n长。 - Ramesh Ramasubramanian

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接