Python - 在一个函数中展平两种不同类型的列表

时间:2015-09-01 12:22:31

标签: python

作为输入,我收到两种类型的列表,这些列表由x和y坐标组成,表示多边形和多面几何。实际上,输入表示在GeoJson standard

list1表示简单多边形几何体的坐标,list2表示多面体几何体:

list1 = [[[0 , 0], [0, 1], [0 ,2]]]

list2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]]

多面体几何体(list2)由比简单多边形几何体(list1)深一层的列表列表表示。

我想展平这些列表以获得这些输出:

   if input is list1 type : list1_out = [[0, 0, 0, 1, 0, 2]]

   if input is list2 type : list2_out = [[0, 0, 0, 1, 0, 2], [1, 0, 1, 1, 1, 2]]

我使用的代码通常用于展平列表,其中input可以是两种类型的列表:

[coords for polygon in input for coords in polygon]

使用上面的代码,list1的输出是正确的,但list2的输出如下:

[[[0, 0] ,[0, 1], [0, 2]], [1, 0], [1, 1], [1, 2]]]

是否有一个函数可以深度压扁这两种类型的列表以获得预期的输出?

编辑:效果真的很重要,因为列表非常大

编辑2:我可以使用if句子来过滤每种类型的列表

2 个答案:

答案 0 :(得分:1)

将您的数据投射到numpy.array,您可以使用reshape

import numpy as np
t = np.array([[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]])
print t.shape  # (1, 2, 3, 2) 
t = np.reshape([1, 2, 6])  # merging the last 2 coordinates/axes 

根据需要展平第二个列表。

适用于这两个列表的代码(因为在这两种情况下,您想要将最后一个合并到轴上)是:

t = np.array(yourList)
newShape = t.shape[:-2] + (t.shape[-2] * t.shape[-1], )  # this assumes your 
# arrays are always at least 2 dimensional (no need to flatten them otherwise...)
t = t.reshape(t, newShape)

关键是保持形状不变直到最后2个轴(因此 t.shape[:-2]),但要将最后两个轴合并在一起(使用长度为t.shape[-2] * t.shape[-1]的轴)

我们通过连接这两个元组来创建新形状(因此乘法后的额外逗号)。

修改:np.reshape() doc是here。重要的参数是输入数组(你的列表,作为数组转换)和一个我称之为newShape的元组,它代表沿新轴的长度。

答案 1 :(得分:1)

尝试;

代表list1

[sum(x, []) for x in list1]

代表list2

[sum(x, []) for a in list2 for x in a]

<强>演示

>>> list1 = [[[0 , 0], [0, 1], [0 ,2]]]
>>> list2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]]
>>> [sum(x, []) for x in list1]
[[0, 0, 0, 1, 0, 2]]
>>> [sum(x, []) for a in list2 for x in a]
[[0, 0, 0, 1, 0, 2], [1, 0, 1, 1, 1, 2]]
>>>