2017-02-01 5 views
2

У меня есть следующий код для получения списка списков с целью создания матрицы чисел:Reverse некоторых элементов в 2d массива для получения матрицы в заданном формате, Python 3

grid=[[1,2,3,4,5,6,7],[8,9,10,11,12],[13,14,15,16,17],[18,19,20,21,22]] 

Об использования следующий код, который я выяснил, что обратный список, он создает матрицу ...

for i in reversed(grid): 
    print(i) 

выход:

[18, 19, 20, 21, 22] 
[13, 14, 15, 16, 17] 
[8, 9, 10, 11, 12] 
[1, 2, 3, 4, 5, 6, 7] 

Я хочу, однако, выход будет ниже, так что числа «подключить», как они идут вверх:

[22,21,20,19,18] 
[13,14,15,16,17] 
[12,11,10,9,8] 
[1,2,3,4,5,6,7] 

Кроме того, для upvote, я был бы заинтересован в более эффективных способах порождающего матрицы в первую очередь. Например, для генерации массива 7x7 - может ли это быть сделано с использованием переменной, например 7 или 49. Или для матрицы 10x10, 10 или 100?

ОБНОВЛЕНИЕ: Да, извините - подписи должны быть одного размера. Опечатка выше

UPDATE НА ОСНОВЕ ОТВЕТА НИЖЕ

Эти две строки:

>>> grid=[[1,2,3,4,5,6,7],[8,9,10,11,12],[13,14,15,16,17],[18,18,20,21,22]] 
>>> [lst[::-1] for lst in grid[::-1]] 

следующий результат:

[[22, 21, 20, 18, 18], [17, 16, 15, 14, 13], [12, 11, 10, 9, 8], [7, 6, 5, 4, 3, 2, 1]] 

, но я хочу, чтобы напечатать одну линию за другой, как матрица .... также, поэтому я могу проверить вывод как указано. Это все, что мне нужно по существу, потому что ответ будет ответом!

+0

подсписков не имеют такую ​​же длину. Можно ли это назвать матрицей? Или это опечатка? – Psidom

+0

«за верх»?но вы не можете взломать :) –

+0

Ой, извините - подсписки должны быть одного размера, 1-7 ..и далее в группах по 7 –

ответ

0

обычно 2D матрицы создаются, манипулируют с NumPy

затем индекс нарезка может изменить порядок строк, столбцов

import numpy as np 

def SnakeMatrx(n): 
    Sq, Sq.shape = np.arange(n * n), (n, n) # Sq matrix filled with a range 
    Sq[1::2,:] = Sq[1::2,::-1] # reverse odd row's columns 
    return Sq[::-1,:] + 1 # reverse order of rows, add 1 to every entry 

SnakeMatrx(5) 
Out[33]: 
array([[21, 22, 23, 24, 25], 
     [20, 19, 18, 17, 16], 
     [11, 12, 13, 14, 15], 
     [10, 9, 8, 7, 6], 
     [ 1, 2, 3, 4, 5]]) 

SnakeMatrx(4) 
Out[34]: 
array([[16, 15, 14, 13], 
     [ 9, 10, 11, 12], 
     [ 8, 7, 6, 5], 
     [ 1, 2, 3, 4]]) 

, если вы действительно хотите составить список списков:

SnakeMatrx(4).tolist() 
Out[39]: [[16, 15, 14, 13], [9, 10, 11, 12], [8, 7, 6, 5], [1, 2, 3, 4]] 

NumPy популярен, но не официальная стандартная библиотека в распределениях Python

, конечно, это можно сделать с помощью списка манипуляций

def SnakeLoL(n): 
    Sq = [[1 + i + n * j for i in range(n)] for j in range(n)] # Sq LoL filled with a range 
    for row in Sq[1::2]: 
     row.reverse()  # reverse odd row's columns 
    return Sq[::-1][:] # reverse order of rows 
# or maybe more Pythonic for return Sq[::-1][:] 
#  Sq.reverse() # reverse order of rows 
#  return Sq 

SnakeLoL(4) 
Out[91]: [[16, 15, 14, 13], [9, 10, 11, 12], [8, 7, 6, 5], [1, 2, 3, 4]] 

SnakeLoL(5) 
Out[92]: 
[[21, 22, 23, 24, 25], 
[20, 19, 18, 17, 16], 
[11, 12, 13, 14, 15], 
[10, 9, 8, 7, 6], 
[1, 2, 3, 4, 5]] 

print(*SnakeLoL(4), sep='\n') 
[16, 15, 14, 13] 
[9, 10, 11, 12] 
[8, 7, 6, 5] 
[1, 2, 3, 4] 
+0

есть причина, которая импортирует numpy как np не работает в IDLE -ImportError: нет модуля с именем 'numpy'. Кроме того, поскольку я разрабатываю образцы для студентов, я действительно не хочу использовать numpy в первую очередь. На самом деле, как говорится в этом вопросе, мне бы хотелось, чтобы самый быстрый способ создания списка списков (столбцов и строк) для заданной матрицы, например. 7x7, и отобразите его на экране, как показано на рисунке –

+0

@PythonFish добавила версию «pure python», как напечатать одну строку списка списков на строку – f5r5e5d

+0

Спасибо, что есть способ обеспечить, чтобы OUTPUT был равномерно выложен, чтобы он выглядел как матрица (четное число пробелов для нижней строки, которая содержит только одно целое число). ТАКЖЕ, ваша версия выше, при печати, не создает матрицу (вывод), а длинный список. Как я могу получить его для печати визуально, как матрица –

1

Вы должны полностью изменить список, а также подсписки:

[lst[::-1] for lst in grid[::-1]] 

Обратите внимание, что lst[::-1] переворачивает список с помощью списка нарезки см here.

Вы можете визуализировать полученные вложенные списки через кратные линии с pprint:

>>> from pprint import pprint 
>>> pprint([lst[::-1] for lst in grid[::-1]]) 
[[22, 21, 20, 19, 18], 
[17, 16, 15, 14, 13], 
[12, 11, 10, 9, 8], 
[7, 6, 5, 4, 3, 2, 1]] 
+0

Вы могли бы объяснить, что lst [:: - 1] действительно нравится? Кроме того, я только что сделал надпись выше, с точки зрения того, как ее печатать, так что она похожа на матрицу. –

+0

@PythonFish См. Мой отредактированный ответ –

+0

Спасибо Chris_Rands. Однако команда pprint не совсем работает - что она делает? SyntaxError: несколько операторов, обнаруженных при компиляции одного оператора –