/ / Wie man einzelne Zahlen einer Box erhält - Python, Python-3.x, Sudoku

wie man einzelne Zahlen einer Box erhält - Python, Python-3.x, Sudoku

Ich kämpfe um jede der vier Zahlen vonein Python-Array, das in einem 2x2-Array in einem separaten Array enthalten ist, ähnlich wie ein Sudoku-Gitter. Ordnung spielt keine Rolle. Ich hätte versucht, einen Code oder etwas zu schreiben, aber meine Gedanken sind leer.

Beispielraster

[
[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]
]

Ich möchte es in der Form bekommen können

[
[ 1,  2,  5,  6],
[ 3,  4,  7,  8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]
]

Antworten:

1 für die Antwort № 1

Hier ist eine reine Python-Lösung. Wenn Sie nach etwas Lesbarem suchen, sollten Sie NumPy verwenden (siehe unten).

>>> from itertools import count, chain
>>>
# create 2x2 blocks of 2x2
>>> c = count(1)
>>> L4D = [[[[next(c) for i in range(2)] for j in range(2)] for k in range(2)] for l in range(2)]
>>> L4D
[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]

# swap middle dimensions
>>> L4D = [zip(*i) for i in L4D]
# next line is not necessary, only here so we can see what"s going on
>>> L4D = [list(i) for i in L4D]
>>> L4D
[[([1, 2], [5, 6]), ([3, 4], [7, 8])], [([9, 10], [13, 14]), ([11, 12], [15, 16])]]

# join first two and last two dimensions
>>> result = [list(chain.from_iterable(j)) for j in chain.from_iterable(L4D)]
>>> result
[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]

Wenn NumPy eine Option ist, kann dies vereinfacht werden. Hier sind drei verschiedene Möglichkeiten. Die erste ist eine direkte Übersetzung der reinen Python-Lösung:

>>> import numpy as np
>>>
>>> np.arange(1, 17).reshape(2, 2, 2, 2).swapaxes(1, 2).reshape(4, 4)
array([[ 1,  2,  5,  6],
[ 3,  4,  7,  8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
>>> np.block(list(map(list, np.arange(1, 17).reshape(2, 2, 2, 2))))
array([[ 1,  2,  5,  6],
[ 3,  4,  7,  8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
>>> a = np.arange(4).reshape(2, 2)
>>> b = np.ones((2, 2), dtype = int)
>>> 4 * np.kron(a, b) + np.kron(b, a) + 1
array([[ 1,  2,  5,  6],
[ 3,  4,  7,  8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])

0 für die Antwort № 2

Ich habe endlich eine Lösung für meine Frage gefunden, mit ein wenig Modifikation dazu Antworten

cells = [[] * 4 for x in range(4)]
for row_index, row in enumerate(grid):
for col_index, col in enumerate(row):
i = col_index//2 + 2*(row_index//2)
cells[i].append(col)