2014-01-13 5 views

ответ

5

С для цикла и немного помощи от 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]] 
+0

Обратите внимание, что это делает обмен на месте ... что может быть именно то, что требуется! –

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.

+0

'zip' не возвращает список в Python3 –

+0

@gnibbler: Спасибо, забыл об этом. Исправлена. –

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']] 
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 равен по размеру.

Смежные вопросы