Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]
Posted
技术标签:
【中文标题】Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]【英文标题】:Python: How to flatten list of lists where each sublist is a contains a single float [closed] 【发布时间】:2020-10-19 23:35:27 【问题描述】:我想展平如下所示的列表:
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]
我尝试了以下方法,但我得到一个 TypeError 说浮动是不可订阅的:
flat_list = [item for sublist in generated for item in sublist]
有人可以帮帮我吗?
【问题讨论】:
这能回答你的问题吗? python list comprehensions; compressing a list of lists? 不,这是一个列表,抱歉我忘记了逗号。但是,如果我尝试 @TrentonMcKinney 的方式,我会得到 typeError 我现在编辑了我的代码@JohnColeman 如果generated
与编辑后的完全一致,那么[item for sublist in generated for item in sublist]
工作正常,您应该能够验证。请阅读提供minimal reproducible example 的重要性。您没有为其他人提供足够的信息来复制问题。
你说得对,对不起,我在代码的其他地方做了一些愚蠢的事情,很抱歉浪费大家的时间,我真的很感谢大家的时间和精力!
【参考方案1】:
在 OP 编辑和 cmets 之后
TypeError 说 floats are unsubscriptable 使用[item for sublist in generated for item in sublist]
时表示列表元素是单个值和列表中的单个值(例如 [[14.22388561], [22.04375228], 34.6576]
)
检查每个元素是否是一个列表。
如果item
类型是一个列表,则取索引 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
并使用 reshape 即可。
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)
【讨论】:
【参考方案2】:flat = [l[0] for l in generated]
【讨论】:
以上是关于Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章