Python:如何展平每个子列表包含一个浮点数的列表列表

Python: How to flatten list of lists where each sublist is a contains a single float

我想展平我的列表,如下所示:

generated = [[108.88114502], [19.29647502], [4.08611068], [52.33578872], [134.54672018], [14.22388561], [22.04375228]]

像这样:

flat_list = [108.88114502, 19.29647502, 4.08611068, 52.33578872, 134.54672018, 14.22388561, 22.04375228]

我尝试了以下方法,但出现类型错误,提示浮点数不可订阅:

flat_list =  [item for sublist in generated for item in sublist]

有人可以帮我吗?

flat = [l[0] for l in generated]

OP 编辑​​和评论后

  • TypeError saying floats are unsubscriptable when using [item for sublist in generated for item in sublist] 意味着列表元素是单个值并且列表中的单个值(例如[[14.22388561], [22.04375228], 34.6576]
  • 检查每个元素是否是一个列表。
    • 如果 item type 是一个列表,取索引 0 处的值,假设每个列表只包含 1 个值。
    • 如果item类型不是列表,取item
generated = [item[0] if type(item) == list else item for item in generated]

OP 编辑​​问题之前的解决方案

  • 我猜 generatednp.array,所以你可以使用 .reshape
    • 如果打印 np.array,输出看起来像操作显示的那样,一个没有 ,
    • 的列表
    • 所示数组的形状为 (7, 1),您希望将其重塑为 (1, 7)
g = generated.reshape(1, 7)

# display g
array([[108.88114502,  19.29647502,   4.08611068,  52.33578872,
        134.54672018,  14.22388561,  22.04375228]])
  • 如果 generated 是一个列表,将其转换为 np.array 并使用重塑即可。
generated = np.array(generated)

generated = generated.reshape(1, 7)  # where 7 is the length of the list)

%%timeit比较

给定 g 作为列表的列表

import numpy as np

np.random.seed(365)
g = [[np.random.randint(100000)/100] for _ in range(1000000)]
测试
%%timeit
[item for sublist in g for item in sublist]
74.6 ms ± 415 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
np.array(g).reshape(1, 1000000)
243 ms ± 2.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

给定 g 作为 (1000000, 1) np.array

np.random.seed(365)
g = [[np.random.randint(100000)/100] for _ in range(1000000)]
g = np.array(g)
测试
%%timeit
[item for sublist in g for item in sublist]
867 ms ± 3.11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
g.reshape(1, 1000000)
289 ns ± 1.16 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)