【问题标题】:Efficiently reduce Series of lists to one dimensional list of non-null values in Python在 Python 中有效地将一系列列表简化为非空值的一维列表
【发布时间】:2019-10-09 19:59:40
【问题描述】:

有没有更好的方法来解决这个问题?

问题:将 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]

【问题讨论】:

    标签: python list series


    【解决方案1】:

    您可以使用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 秒 ± 228 毫秒(7 次运行的平均值 ± 标准偏差,每个循环 1 个)

    【讨论】:

    • 感谢您的详尽回复!
    【解决方案2】:
    status = [[], [], [], [], ['200'], [], [], ['200']]
    l = [i for sublist in status for i in sublist]
    

    输出

    ['200', '200']
    

    【讨论】:

      【解决方案3】:

      这称为列表展平:

      l =[e for i in status for e in i]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2021-06-17
        • 2022-12-29
        相关资源
        最近更新 更多