【问题标题】:Swap columns in a nested list (Python 3)交换嵌套列表中的列(Python 3)
【发布时间】:2014-01-13 00:35:11
【问题描述】:

像这样使用嵌套列表:

N = [['D','C','A','B'],
     [2,3,4,5],
     [6,7,8,9]]

如何交换两列?例如 C 列和 A 列。

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:

    使用 for 循环和来自 this 帖子的一点帮助:

    代码:

    N = [["D","C","A","B"],
         [2,3,4,5],
         [6,7,8,9]]
    
    # Swap the last two columns
    
    for item in N:
        item[2], item[3] = item[3], item[2]
    
    # Or as a function
    
    def swap_columns(your_list, pos1, pos2):
        for item in your_list:
            item[pos1], item[pos2] = item[pos2], item[pos1]
    

    输出:

    swap_columns(N, 2, 3)
    [['D', 'C', 'B', 'A'], [2, 3, 5, 4], [6, 7, 9, 8]]
    

    【讨论】:

    • 请注意,这会使交换就地......这可能正是我们想要的!
    【解决方案2】:

    另一种可能,使用zip

    In [66]: N = [['D', 'C', 'A', 'B'], [2, 3, 4, 5], [6, 7, 8, 9]]
    

    使用zip转置:

    In [67]: M = list(zip(*N))
    

    交换第 1 行和第 2 行:

    In [68]: M[1], M[2] = M[2], M[1]
    

    再次转置:

    In [69]: N2 = list(zip(*M))
    
    In [70]: N2
    Out[70]: [('D', 'A', 'C', 'B'), (2, 4, 3, 5), (6, 8, 7, 9)]
    

    结果是一个元组列表。如果您需要列表列表:

    In [71]: [list(t) for t in zip(*M)]
    Out[71]: [['D', 'A', 'C', 'B'], [2, 4, 3, 5], [6, 8, 7, 9]]
    

    这不会使交换就地。为此,请参阅@DaveTucker 的回答。

    【讨论】:

    • zip 在 Python3 中不返回列表
    • @gnibbler:谢谢,忘记了。固定。
    【解决方案3】:
    >>> N = [['D','C','A','B'],
    ...      [2,3,4,5],
    ...      [6,7,8,9]]
    >>> 
    >>> lineorder = 0,2,1,3
    >>> 
    >>> [[r[x] for x in lineorder] for r in N]
    [['D', 'A', 'C', 'B'], [2, 4, 3, 5], [6, 8, 7, 9]]
    

    如果您不希望订单硬编码,您可以像这样轻松生成它

    >>> lineorder = [N[0].index(x) for x in ['D','A','C','B']]
    

    【讨论】:

      【解决方案4】:

      要在一行中创建一个 N 的副本,其中两列 S 交换,您可以执行以下操作:

      >>> N = [['D','C','A','B'],[2,3,4,5],[6,7,8,9]]
      >>> S = [[n[0],n[2],n[1],n[3]] for n in N]
      >>> S
      [['D', 'A', 'C', 'B'], [2, 4, 3, 5], [6, 8, 7, 9]]
      

      这假设 N 的每个嵌套列表大小相等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 2018-01-08
        相关资源
        最近更新 更多