【问题标题】:How do I transpose a List? [duplicate]如何转置列表? [复制]
【发布时间】:2014-06-24 21:10:08
【问题描述】:

假设我有一个单一列表[[1,2,3],[4,5,6]]

我如何将它们转置为:[[1, 4], [2, 5], [3, 6]]

我必须使用zip 函数吗? zip 函数是最简单的方法吗?

def m_transpose(m):
    trans = zip(m)
    return trans

【问题讨论】:

    标签: python list matrix add transpose


    【解决方案1】:

    使用zip*splat 是纯Python 中最简单的方法。

    >>> list_ = [[1,2,3],[4,5,6]]
    >>> zip(*list_)
    [(1, 4), (2, 5), (3, 6)]
    

    请注意,您得到的是元组而不是列表。如果您需要这些列表,请使用map(list, zip(*l))

    如果您愿意使用 numpy 而不是列表列表,那么使用 .T 属性会更容易:

    >>> import numpy as np
    >>> a = np.array([[1,2,3],[4,5,6]])
    >>> print(*a)
    [1 2 3] [4 5 6]
    >>> print(*a.T)
    [1 4] [2 5] [3 6]
    

    【讨论】:

      【解决方案2】:

      使用zip()并得到你想要的确切方法是:

      >>> l = [[1,2,3],[4,5,6]]
      >>> [list(x) for x in zip(*l)]
      >>> [[1, 4], [2, 5], [3, 6]]
      

      此代码使用list 关键字将zip 返回的tuples 转换为lists

      【讨论】:

        【解决方案3】:

        您可以使用mapNone 作为第一个参数:

        >>> li=[[1,2,3],[4,5,6]]
        >>> map(None, *li)
        [(1, 4), (2, 5), (3, 6)]
        

        zip 不同,它适用于不均匀的列表:

        >>> li=[[1,2,3],[4,5,6,7]]
        >>> map(None, *li)
        [(1, 4), (2, 5), (3, 6), (None, 7)]
        >>> zip(*li)
        [(1, 4), (2, 5), (3, 6)]
        #                      ^^ 7 missing...
        

        如果您希望子元素是列表而不是元组,则以list 作为第一个参数再次调用 map:

        >>> map(list, map(None, *li))
        [[1, 4], [2, 5], [3, 6]]
        

        (注意:在 Python 3.x 中不支持使用带有 None 的 map 来转置矩阵。使用 itertools 中的 zip_longest 来获得相同的功能...)

        【讨论】:

          【解决方案4】:

          zip() 似乎没有做你想做的事,使用zip() 你会得到listtuples。不过这应该可行:

          >>> new_list = []
          >>> old_list = [[1,2,3],[4,5,6]]
          >>> for index in range(len(old_list[0])):
          ...     new_list.append([old_list[0][index], old_list[1][index]])
          ... 
          >>> new_list
          [[1, 4], [2, 5], [3, 6]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-26
            • 2016-02-08
            • 2019-09-27
            • 2019-09-21
            • 1970-01-01
            • 2021-07-27
            相关资源
            最近更新 更多