Ich habe eine Liste von Listen, etwas wie
[[1, 2, 3,],[4, 5, 6,],[7, 8, 9]]
.
Grafisch dargestellt als:
%Vor%Ich suche nach einem eleganten Ansatz, um den Wert von Nachbarn einer Zelle horizontal, vertikal und diagonal zu überprüfen. Zum Beispiel sind die Nachbarn von [0] [2] [0] [1], [1] [1] und [1] [2] oder die Zahlen 2, 5, 6.
Jetzt merke ich, ich könnte einfach einen Bruteforce-Angriff machen und jeden Wert überprüfen:
%Vor%Aber das ist einfach, und ich dachte mir, ich könnte mehr lernen, wenn ich einige elegantere Ansätze sehe.
Angenommen, Sie haben eine quadratische Matrix:
%Vor% itertools.product
und dank Pythons der Ausdruck und Stern-Operator , die Funktion ist ziemlich trocken aber immer noch lesbar genug .
Bei einer Matrixgröße von 3 können Sie dann (falls erforderlich) die Nachbarn in einem list
:
Was die Funktion macht, kann wie folgt visualisiert werden:
Es gibt keinen saubereren Weg, dies zu tun. Wenn Sie wirklich wollen, könnten Sie eine Funktion erstellen:
%Vor%Hier ist Ihre Liste:
%Vor%Also sind die horizontalen Nachbarn von (x, y) (x +/- 1, y).
Die vertikalen Nachbarn sind (x, y +/- 1).
Diagonale Nachbarn sind (x +/- 1, y +/- 1).
Diese Regeln gelten für eine unendliche Matrix. Um sicherzustellen, dass die Nachbarn in eine endliche Matrix passen, muss, wenn der Anfang (x, y) am Rand ist, nur eine weitere Einschränkung auf die Koordinaten von Nachbarn angewendet werden - die Matrixgröße.
Ich weiß nicht, wie elegant es Ihnen scheint, aber es scheint ohne jede Hard-Codierung zu funktionieren.
Danke @JS_is_bad für einen tollen Hinweis über die Nachbarn. Hier ist der laufende Code für dieses Problem
%Vor%