Как я могу создать квадратный список целых чисел в Python? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать квадратную матрицу с целочисленным вводом.

Например:

# for n=3
m = [[1, 2, 3], [4, 5, 6],[7, 8, 9]] 

моя попытка:

m = list(list(range(1*i,(n+1)*i,i)) for i in range(1,n+1))
print(m)

печатает эторезультат:

[[1, 2, 3], [2, 4, 6], [3, 6, 9]]

Массив должен быть квадратным и состоять из последовательных целых чисел.

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

Вы можете использовать itertools.count для создания итератора, который выдает возрастающие числа, а затем продвигать этот итератор во вложенном понимании списка , используя next функция:

import itertools

n = 3

itr = itertools.count(1)  # start counting at 1
matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
# result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
0 голосов
/ 10 октября 2018

Вот один из способов:

n = 3
m = [list(range(1+n*i, 1+n*(i+1))) for i in range(n)]

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Основное недоразумение, по-видимому, заключается в определении шаблона .Например, первое значение в каждом столбце может быть вычислено с помощью 1 + 3 * i, где i повторяется по 0, 1, 2.Для аргумента end, равного range, вам просто нужно добавить n к формуле, и мы можем использовать тождество:

n*i + n = n*(i+1)

В качестве отступления, если вырад использовать стороннюю библиотеку, это просто для NumPy:

import numpy as np

n = 3
A = np.arange(1, n**2 + 1).reshape((n, n))

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
0 голосов
/ 10 октября 2018

я скорее использую numpy ( ЭТО НЕ СПИСОК , поэтому я знаю, что это не обязательный OP, однако он все еще может быть интересным)

def func(n):
    l = np.asarray([i for i in range(1,n**2+1)])
    return l.reshape(n,n)

func(3)
>>> array([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])

также учитывайте времядля вычисления:

def func(n):
   t = time.time()
   np.arange(1, n**2 + 1).reshape((n, n))
   t1 = time.time()-t
   t = time.time()
   np.asarray([i for i in range(1,n**2+1)]).reshape(n,n)
   t2 = time.time()-t
   t = time.time()
   [list(range(1+n*i, 1+n*(i+1))) for i in range(n)]
   t3 = time.time()-t
   t = time.time()
   itr = itertools.count(1)  # start counting at 1
   matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
   t4 = time.time()-t
   return [t1,t2,t3,t4]

plt.plot([re[0] for re in res],'r',label = 'numpy')
plt.plot([re[1] for re in res],'b',label = 'asarray')
plt.plot([re[2] for re in res],'m',label = 'list')
plt.plot([re[3] for re in res],'g',label = 'itertool')
plt.legend()
plt.savefig('plt1.png')

даст следующий график для 200 точек: enter image description here

для большой матрицы, перейдите прямо к пустому решению @ jpp

0 голосов
/ 10 октября 2018

Вы можете использовать исчерпывающие списки.Для матрицы, заполненной нулями:

mat = [[0 for i in range(N)] for i in range(N)]

Для матрицы с последовательными элементами (начиная с нуля):

mat = [[(N*j + i) for i in range(N)] for j in range(N)]

Для матрицы с последовательными элементами (начиная с одной):

mat = [[(N*j + i +1) for i in range(N)] for j in range(N)]

А для квадратной печати вы можете использовать:

>>> print(*mat,sep="\n")
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...