代码之家  ›  专栏  ›  技术社区  ›  Vural Erdogan

提取2D列表的第一列以及单行中的索引

  •  0
  • Vural Erdogan  · 技术社区  · 7 年前

    您如何将这两个列表理解缩短为一行?我想用一行代码。我的路似乎太长了。我觉得有另一种方法来编码它。

    y = [array[i][0] for i in range(len(array))]
    x = [i for i in range(len(array))]
    
    x, y = [i for i in range(len(array))], [array[i][0] for i in range(len(array))]
    
    3 回复  |  直到 7 年前
        1
  •  6
  •   cs95 abhishek58g    7 年前

    假设您想提取2D列表的第一列及其索引,您可以使用 enumerate 带反转- zip 拆包:

    array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    x, y = zip(*enumerate([r[0] for r in array]))
    

    print(x)
    (0, 1, 2)
    
    print(y)
    (1, 4, 7)
    

    x 是索引,并且 y 是行向量。如上所述,此方法会将数据提取为 tuple s (不是 list s) ,并将在以下情况下失败 array 为空。

    正如@user2357112在他们的 comment ,请不要用力推 全部的 您的代码只有在可以完成并且这样做有意义的情况下,才能放在一行中。

    此外,为了扩展评论中的讨论 最好的 实现这一点的方法是按照@Rakesh在其 answer :

    x = list(range(len(array)))
    y = [r[0] for r in array]
    

    print(x)
    [0, 1, 2]
    
    print(y)
    [1, 4, 7]
    

    这没有上述缺点。

        2
  •  2
  •   Rakesh    7 年前

    这应该会有帮助

    x = range(len(array))    #range returns  list
    y = [i[0] for i in array]    #you can access the element in the list without range or len 
    
        3
  •  0
  •   ely    7 年前
    x, y = list(map(list, zip(*[(i, r[0]) for i, r in enumerate(a)]))) or ([], [])
    

    免责声明:我认为在这种情况下,一行代码是一件坏事。