Разбить 2D-список на квадратные блоки с равномерно распределенными элементами - PullRequest
0 голосов
/ 06 октября 2018

Допустим, у меня есть список

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

Теперь я хочу разделить этот список на другие меньшие квадратные 2d списки, где сторона квадрата определяется входом k.Поэтому, если бы k равнялось 2, я бы получил 4 новых списка, пытаясь равномерно распределить элементы между ними, и эти списки были бы:

L1 = [1,2,
      4,5]

L2 = [3,
      6]

L3 = [7,8]

L4 = [9]

Я не уверен, как мне это сделать.Я могу разделить список, если я решу количество квадратов, но не если число квадратов является случайным числом, введенным пользователем.Я попробовал это, но я не уверен, как мне продолжить с этого момента, после выбора первого блока элементов.

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

def splitList(ls, k):
  if len(ls) == 1:
    return ls[0]
  else:
    for x in range(k):
      for y in range(k):
        print (ls[x][y])


print (splitList(ls, 2))

Любая помощь будет принята с благодарностью.Спасибо за ваше время!

Ответы [ 2 ]

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

Если у вас есть для разбиения 2D списка списков , вы не должны использовать Numpy np.array, который не является списком ...

Давайте определим альтернативный способ печати списка списков

In [79]: def pmat(mat):
    ...:     for row in mat:
    ...:         print(''.join('%5d'%x for x in row))

Числовые параметры

In [80]: nr, nc, k = 6, 8, 4

Создайте LoL и проверьте его, напечатав

In [81]: a = [[1+c+r*nc for c in range(nc)] for r in range(nr)]
In [82]: pmat(a)
    1    2    3    4    5    6    7    8
    9   10   11   12   13   14   15   16
   17   18   19   20   21   22   23   24
   25   26   27   28   29   30   31   32
   33   34   35   36   37   38   39   40
   41   42   43   44   45   46   47   48

У нас нет умной индексации, поэтому мы должны использовать обычную индексацию (т. Е. Двойную пару скобок) и понимание списка

In [83]: a11 = [a[r][:k] for r in range(k)]    ; a12 = [a[r][k:] for r in range(k)]
In [84]: a21 = [a[r][:k] for r in range(k,nr)] ; a22 = [a[r][k:] for r in range(k,nr)]

Наконец мы проверяем наши результаты.

In [85]: pmat(a11)
    1    2    3    4
    9   10   11   12
   17   18   19   20
   25   26   27   28

In [86]: pmat(a12)
    5    6    7    8
   13   14   15   16
   21   22   23   24
   29   30   31   32

In [87]: pmat(a21)
   33   34   35   36
   41   42   43   44

In [88]: pmat(a22)
   37   38   39   40
   45   46   47   48
0 голосов
/ 06 октября 2018

Простой способ добиться этого - использовать numpy массивы вместо "2d списков" (вы можете легко преобразовать один в другой) и выполнить базовую нарезку :

import numpy as np

ls = np.array([[1,2,3], 
               [4,5,6], 
               [7,8,9]])

nr = ls.shape[0]  # number of rows
nc = ls.shape[1]  # number of columns

Затем делаем нарезку

L1 = ls[:k, :k]
L2 = ls[:k, k:nc]
L3 = ls[k:nr, :k]
L4 = ls[k:nr, k:nc]
...