在嵌套列表中交换列(Python 3)

时间:2014-01-13 00:35:11

标签: python list python-3.x

使用这样的嵌套列表:

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

我怎么能交换两列?例如C列和A列。

4 个答案:

答案 0 :(得分:7)

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

<强>代码:

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]]

答案 1 :(得分:1)

另一种可能性,使用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的回答。

答案 2 :(得分:0)

>>> 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']]

答案 3 :(得分:0)

要创建一个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的每个嵌套列表的大小相等。