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 编辑问题之前的解决方案
- 我猜
generated
是 np.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)
我想展平我的列表,如下所示:
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 编辑问题之前的解决方案
- 我猜
generated
是np.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)