有效地将一系列列表缩减为 Python 中非空值的一维列表
Efficiently reduce Series of lists to one dimensional list of non-null values in Python
有没有更好的方法来解决这个问题?
问题:减少pandas系列,status,列出l下面给出;
status = [[], [], [], [], ['200'], [], [], ['200']]
l = ['200', '200']
我是这样解决的;
def flatten(x):
if len(x)>0:
return x[0]
else:
return ""
status = status[status.apply(lambda x: flatten(x)) != ""]
l = [i for row in status.iloc[:] for i in row]
status = [[], [], [], [], ['200'], [], [], ['200']]
l = [i for sublist in status for i in sublist]
输出
['200', '200']
您可以使用 itertools
包来高效地展平列表。
import itertools
import pandas as pd
df = pd.DataFrame({
"a": [[], [], [200], [], [200]]
})
list2d = df["a"].values
list(itertools.chain(*list2d))
输出:
[200, 200]
时间测试
首先让我们创建一个虚拟二维列表:
list2d = [[_] for _ in range(100000000)]
Itertools 扁平化:
%%timeit
[*itertools.chain(*list2d)]
每个循环 5.55 秒 ± 151 毫秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
列表理解扁平化:
%%timeit
[e for i in list2d for e in i]
每个循环 6.34 s ± 228 ms(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
这称为列表扁平化:
l =[e for i in status for e in i]
有没有更好的方法来解决这个问题?
问题:减少pandas系列,status,列出l下面给出;
status = [[], [], [], [], ['200'], [], [], ['200']]
l = ['200', '200']
我是这样解决的;
def flatten(x):
if len(x)>0:
return x[0]
else:
return ""
status = status[status.apply(lambda x: flatten(x)) != ""]
l = [i for row in status.iloc[:] for i in row]
status = [[], [], [], [], ['200'], [], [], ['200']]
l = [i for sublist in status for i in sublist]
输出
['200', '200']
您可以使用 itertools
包来高效地展平列表。
import itertools
import pandas as pd
df = pd.DataFrame({
"a": [[], [], [200], [], [200]]
})
list2d = df["a"].values
list(itertools.chain(*list2d))
输出:
[200, 200]
时间测试
首先让我们创建一个虚拟二维列表:
list2d = [[_] for _ in range(100000000)]
Itertools 扁平化:
%%timeit
[*itertools.chain(*list2d)]
每个循环 5.55 秒 ± 151 毫秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
列表理解扁平化:
%%timeit
[e for i in list2d for e in i]
每个循环 6.34 s ± 228 ms(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
这称为列表扁平化:
l =[e for i in status for e in i]