【问题标题】:Python: How to flatten list of lists where each sublist is a contains a single float [closed]Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]
【发布时间】: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]

有人可以帮帮我吗?

【问题讨论】:

  • 不,这是一个列表,抱歉我忘记了逗号。但是,如果我尝试 @TrentonMcKinney 的方式,我会得到 typeError
  • 我现在编辑了我的代码@JohnColeman
  • 如果generated 与编辑后的完全一致,那么[item for sublist in generated for item in sublist] 工作正常,您应该能够验证。请阅读提供minimal reproducible example 的重要性。您没有为其他人提供足够的信息来复制问题。
  • 你说得对,对不起,我在代码的其他地方做了一些愚蠢的事情,很抱歉浪费大家的时间,我真的很感谢大家的时间和精力!

标签: python list multidimensional-array flatten


【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多