有效地将一系列列表缩减为 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]