【问题标题】:Unpack series of tuples and lists into 1-d list?将一系列元组和列表解压缩成一维列表?
【发布时间】:2020-12-11 19:44:18
【问题描述】:

我正在尝试从三种列表中创建一个数组。比如l1l2l3。我收到错误说 float 不可迭代。如何在 python 中将这些列表解压成一维列表?

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, l2, l3)

错误


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

<ipython-input-26-159b13d00464> in unpack_lines(l1, l2, l3)
      1 def unpack_lines(l1, l2, 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,
 268.01,
 500.87,
 678.9,
 506.0,
 149.86,
 354.48,
 182.39,
 344.2]

【问题讨论】:

  • return list(itertools.chain.from_iterable(itertools.chain(l1, l2, l3)))
  • extend 接受一个可迭代的。你的意思可能是append,或者extend(list[i])
  • 我想要 numpy 的一维数组,所以我确实扩展了 - 我正在尝试这样的事情 - [a, b, c, d, e, f, ..... ]
  • 这能回答你的问题吗? How to make a flat list out of list of lists?
  • @wjandrea - 不是真的,他们只有列表,但在我的问题中,我有列表和元组。类似问题,谢谢

标签: python python-3.x list flatten


【解决方案1】:

您可以只使用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, l2, 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, 268.01, 500.87, 678.9 , 506.  ,
       149.86, 354.48, 182.39, 344.2 ])
>>> list(_)
[260.3, 185.0, 268.01, 499.16, 268.01, 500.87, 678.9, 506.0, 149.86, 354.48, 182.39, 344.2]

【讨论】:

  • 很抱歉。更新:)
  • 很高兴我能帮上忙 :)
  • @ajayramesh 请检查更新。使用numpy 时,您很少想使用listnumpy 通常有最好的东西
  • 是有道理的,因为我的目标是获得一维 numpy 数组。再次感谢您:)
  • 是的,没问题:)
【解决方案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, 185.0), (268.01, 499.16)]
l2=[(268.01, 500.87), (678.9, 506.0)]
l3=((149.86, 354.48), (182.39, 344.2))
result = unpack(l1)+unpack(l2)+unpack(l3)

【讨论】:

    【解决方案3】:

    如果您的目标是简单地展平元组列表,您可以使用这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 2011-06-17
      • 2015-08-24
      • 2014-08-26
      • 1970-01-01
      • 2014-07-13
      • 2015-08-24
      相关资源
      最近更新 更多