Python:高效的 unrolling/flattening 元组列表和单个浮点数
Python: Efficient unrolling/flattening list of tuples and single floats
我有一个元组列表和单个浮点数
v = [(1., 2., 3.), (4., 5.), 6., 7.]
现在我想用好的旧列表理解来压平它
[item for sublist in v for item in sublist]
但出现错误,因为单个浮点数不可迭代。展开此混合列表的最有效方法是什么?我试图通过列表并使用 isininstance()
但再一次,列表不可迭代。
编辑:到目前为止的时间比较
- 使用 hstack 的 numpy 方法:每个循环 6.49 µs ± 100 ns
- hasattr 方法:每个循环 398 ns ± 2.11 ns
- 收集方法:每个循环 804 ns ± 1.27 ns
使用 numpy
你可以使用 hstack():
v = [(1., 2., 3.), (4., 5.), 6., 7.]
v = np.hstack(v)
# Output
array([1., 2., 3., 4., 5., 6., 7.])
您可以使用 hasattr
检查对象是否可迭代(具有 __iter__
方法):
out = [item for sublist in v
for item in (sublist if hasattr(sublist, '__iter__') else [sublist])]
输出:[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])]
请注意,在这两种情况下,字符串都被认为是可迭代的,您可能需要根据您的数据检查这种特定情况。
more-itertools包有一个专门针对这个问题的函数-
from more_itertools import collapse
v = [(1., 2., 3.), (4., 5.), 6., 7.]
print(list(collapse(v))
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
它也适用于字符串 -
x = [('ab', 'cd'), 'e', ['f', 'gh']]
print(list(collapse(x))
['ab', 'cd', 'e', 'f', 'gh']
我有一个元组列表和单个浮点数
v = [(1., 2., 3.), (4., 5.), 6., 7.]
现在我想用好的旧列表理解来压平它
[item for sublist in v for item in sublist]
但出现错误,因为单个浮点数不可迭代。展开此混合列表的最有效方法是什么?我试图通过列表并使用 isininstance()
但再一次,列表不可迭代。
编辑:到目前为止的时间比较
- 使用 hstack 的 numpy 方法:每个循环 6.49 µs ± 100 ns
- hasattr 方法:每个循环 398 ns ± 2.11 ns
- 收集方法:每个循环 804 ns ± 1.27 ns
使用 numpy
你可以使用 hstack():
v = [(1., 2., 3.), (4., 5.), 6., 7.]
v = np.hstack(v)
# Output
array([1., 2., 3., 4., 5., 6., 7.])
您可以使用 hasattr
检查对象是否可迭代(具有 __iter__
方法):
out = [item for sublist in v
for item in (sublist if hasattr(sublist, '__iter__') else [sublist])]
输出:[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])]
请注意,在这两种情况下,字符串都被认为是可迭代的,您可能需要根据您的数据检查这种特定情况。
more-itertools包有一个专门针对这个问题的函数-
from more_itertools import collapse
v = [(1., 2., 3.), (4., 5.), 6., 7.]
print(list(collapse(v))
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
它也适用于字符串 -
x = [('ab', 'cd'), 'e', ['f', 'gh']]
print(list(collapse(x))
['ab', 'cd', 'e', 'f', 'gh']