【问题标题】:unpick a list of lists in Python在 Python 中取消选择列表列表
【发布时间】:2014-03-13 23:46:37
【问题描述】:

我在 Python 中有一个包含 3 个列表的列表

mylist = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]

我用 3 行代码解压

first= [m[0] for m in mylist]
second = [m[1] for m in mylist]
third = [m[2] for m in mylist]

我希望为相同的内容找到一个有效的单行代码...

【问题讨论】:

    标签: python list list-comprehension unpack


    【解决方案1】:

    你可以使用zip:

    first,second,third = zip(*[[1, 2, 3], [10, 20, 30], [100, 200, 300]])
    
    In [10]: first
    Out[10]: (1, 10, 100)
    
    In [11]: second
    Out[11]: (2, 20, 200)
    
    In [12]: third
    Out[12]: (3, 30, 300)
    

    【讨论】:

    • 对于矩阵(每行长度相同的列表的列表),zip(*data) 相当于转置函数。
    • @IceArdor,ndarray.transpose() 比 zip 有什么优势?
    • 我指的是转置的高级概念。在 Python 中,它被称为 zip。在 NumPy 中,它被称为转置。在 MATLAB 中,它被称为转置或 A'。我不熟悉 numpy 的 ndarray.transpose 函数是如何编写的,所以我无法说出它与 Python 的内置 zip 相比如何。
    【解决方案2】:

    您确定不应该为此使用 numpy 吗?

    >>> import numpy
    >>> myarray = numpy.array(mylist)
    >>> myarray
    array([[  1,   2,   3],
           [ 10,  20,  30],
           [100, 200, 300]])
    

    直接访问它们:

    >>> myarray[...,0]
    array([  1,  10, 100])
    >>> myarray[...,1]
    array([  2,  20, 200])
    >>> myarray[...,2]
    array([  3,  30, 300])
    

    如果你愿意,也可以给他们起名字:

    >>> a, b, c = myarray
    >>> a
    array([1, 2, 3])
    >>> b
    array([10, 20, 30])
    >>> c
    array([100, 200, 300])
    >>> d, e, f = myarray.transpose()
    >>> d
    array([  1,  10, 100])
    >>> e
    array([  2,  20, 200])
    >>> f
    array([  3,  30, 300])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多