将一系列元组和列表解压缩到一维列表中? 错误预期产量

问题描述

我正在尝试从三种列表中创建一个数组。像l1l2l3一样。我收到错误消息说float不可迭代。如何将这些列表解压缩为python中的1-d列表?

l1=[(260.3,185.0),(268.01,499.16)]
l2=[(268.01,500.87),(678.9,506.0)]
l3=((149.86,354.48),(182.39,344.2))
def unpack_lines(l1,l2,l3):
    out = []
    out.extend(l1[0][0])
    out.extend(l1[0][1])
    out.extend(l1[1][0])
    out.extend(l1[1][1])
    out.extend(l2[0][0])
    out.extend(l2[0][1])
    out.extend(l2[1][0])
    out.extend(l2[1][1])
    out.extend(l3[0][0])
    out.extend(l3[0][1])
    out.extend(l3[1][0])
    out.extend(l3[1][1])
    return out

unpack_lines(l1,l3)

错误


TypeError                                 Traceback (most recent call last)
<ipython-input-27-6f84bf5b956a> in <module>
----> 1 unpack_lines(l1,l3)

<ipython-input-26-159b13d00464> in unpack_lines(l1,l3)
      1 def unpack_lines(l1,l3):
      2     out = []
----> 3     out.extend(l1[0][0])
      4     out.extend(l1[0][1])
      5     out.extend(l1[1][0])

TypeError: 'float' object is not iterable

预期产量

[260.3,185.0,268.01,499.16,500.87,678.9,506.0,149.86,354.48,182.39,344.2]

解决方法

您可以只在itertools.chain.from_iterable之类的itertools.chain中使用

>>> list(itertools.chain.from_iterable(itertools.chain(l1,l2,l3)))

注意:如果您需要做的就是遍历值,那么我将放弃list创建,否则就可以了。

尽管,我看到您正在与numpy合作。然后,您可以像这样flatten数组,

>>> import numpy as np
>>> 
>>> l1=[(260.3,185.0),(268.01,499.16)]
>>> l2=[(268.01,500.87),(678.9,506.0)]
>>> l3=((149.86,354.48),(182.39,344.2))
>>> 
>>> data = np.array([l1,l3])
>>> data
array([[[260.3,185.  ],[268.01,499.16]],[[268.01,500.87],[678.9,506.  ]],[[149.86,354.48],[182.39,344.2 ]]])

>>> data.flatten()
array([260.3,185.,268.01,499.16,500.87,678.9,506.,149.86,354.48,182.39,344.2 ])
>>> list(_)
[260.3,185.0,506.0,344.2]
,

如果您的目标只是简单地平整礼拜堂清单,则可以使用以下方法:

[item for sublist in zip(l1,l3) for tupel in sublist for item in tupel]

Out[4]: 
[260.3,344.2]
,

使用此递归函数。

def unpack(item):
    result = []
    if item is not None:
        if type(item) in [list,tuple]:
            for element in item:
                result.extend(unpack(element))
        elif type(item) is float:
            for elemtn in item:
                result.append(item)
    return result 
l1=[(260.3,499.16)]
l2=[(268.01,506.0)]
l3=((149.86,344.2))
result = unpack(l1)+unpack(l2)+unpack(l3)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...