Python:有效展开/展平元组和单个浮点列表

Ale*_*lex 2 python tuples list flatten

我有一个元组和单个浮点数的列表

\n
v = [(1., 2., 3.), (4., 5.), 6., 7.]\n
Run Code Online (Sandbox Code Playgroud)\n

现在我想用旧的列表理解来压平它

\n
[item for sublist in v for item in sublist]\n
Run Code Online (Sandbox Code Playgroud)\n

但是,由于单个浮点不可迭代,因此会发生错误。展开这个混合列表的最有效方法是什么?我尝试遍历列表并使用,isininstance()但再一次,该列表不可迭代。

\n

编辑:到目前为止的时间比较

\n
    \n
  • 使用 hstack 的 numpy 方法:6.49 \xc2\xb5s \xc2\xb1 每个循环 100 ns
  • \n
  • hasattr 方法:398 ns \xc2\xb1 每个循环 2.11 ns
  • \n
  • 集合方法:804 ns \xc2\xb1 每个循环 1.27 ns
  • \n
\n

moz*_*way 5

您可以使用hasattr检查对象是否可迭代(有__iter__方法):

out = [item for sublist in v
       for item in (sublist if hasattr(sublist, '__iter__') else [sublist])]
Run Code Online (Sandbox Code Playgroud)

输出:[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

另一种选择是使用collections.abc

from collections.abc import Iterable
    
out = [item for sublist in v
       for item in (sublist if isinstance(sublist, Iterable) else [sublist])]   
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,字符串都被认为是可迭代的,您可能需要根据您的数据检查这种特定情况。