代码之家  ›  专栏  ›  技术社区  ›  Sun Jar

用Python填写大小不均的列表

  •  0
  • Sun Jar  · 技术社区  · 4 年前

    我有一个2D列表包含大小不等的数字,如下所示:

    lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
    

    如果元素大小小于3,我使用此代码插入0:

    newlist = [val.insert(1,0) for val in lst if len(val)<3]
    

    但我只是得到了一个空的 newlist 原著呢 lst 被插入一个 0 .

    >>> lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
    >>> newlist = [val.insert(1,0) for val in lst if len(val)<3]
    >>> newlist
    [None]
    >>> lst
    [[1, 2, 3], [-1, 2, 4], [0, 0, 2], [2, -3, 6]]
    

    我不想用旧的 lst 列出值,因为如果修改值可以返回 新名单 ,我可以直接用它转换成数据帧。这样地:

    df = pd.DataFrame([val.insert(1,0) for val in lst if len(val)<3])
    

    那么,我该怎么做呢?我希望代码可以用一行程序编写。

    2 回复  |  直到 4 年前
        1
  •  3
  •   Rodrigo Rodrigues    4 年前

    代码中的问题是 val.insert(1,0) 对列表进行适当的变异,但不返回任何值。

    我的建议如下。它可能不完全是您所期望的输出(因为它返回一个元组数组),但它可能会用于您的目的:

    from itertools import zip_longest
    list(zip(*zip_longest(*lst, fillvalue=0)))
    
    # output: 
    # [(1, 2, 3), (-1, 2, 4), (0, 2, 0), (2, -3, 6)]
    

    说明:

    [zip_longest][1] 聚合每个序列中的元素,如果它们的长度不均匀,则用 fillvalue .通过使用 * 运算符,每个内部列表作为单独的参数传递给函数。

    在完成zip_longest并填充缺失后,我将再次对其进行压缩(结果被第一次压缩转换)。

        2
  •  1
  •   Zero    4 年前

    你得到的价值是零 newlist 因为 val.insert(1,0) 返回 None 作为输出。

    试试这个,

    lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
    new_list = [i + [0] if len(i) < 3 else i for i in lst]
    print(new_list)
    

    输出-

    [[1, 2, 3], [-1, 2, 4], [0, 2, 0], [2, -3, 6]]
    
        3
  •  1
  •   mozway    4 年前

    保持简单。您最初的方法是有效的,但只需使用经典循环:

    lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
    # if needed, keep a copy
    # old_lst = lst.copy()
    
    for l in lst:
        if len(l)<3:
            l.insert(1,0)
            
    pd.DataFrame(lst)
    

    输出:

       0  1  2
    0  1  2  3
    1 -1  2  4
    2  0  0  2
    3  2 -3  6