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 编辑​​问题之前的解决方案

我猜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 并使用 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:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当列表包含另一个列表的 1 个单个项目时,展平嵌套列表

如何展平包含具有不同数量字典的列表的列表? [复制]

当某些列表包含 Null 值时,如何展平列表列?

如何在 Python 中完全展平列表? [复制]

展平 Python 列表而不创建任何对象的副本?

如何展平Python字典中键的值(元组列表列表)?