#python #2d
#python #2d
Вопрос:
У меня есть такой 2d-список:
[['X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' '],
['X', ' ', 'X', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' '],
['X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
['X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'X'],
[' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
Он представляет собой 2d-карту. Есть ли лучший / более эффективный способ найти эту структуру:
XXX
X X
X X
XXX
чем это:
if map[y][x] == map[y][x 1] == map[y][x 2] == map[y 1][x] == map[y 1][x 2] == map[y 2][x] == map[y 2][x 2] == map[y 3][x] == map[y 3][x 1] == map[y 3][x 2] =="X" and map[y 1][x 1] == map[y 2][x 1] == " ":
return True
else: return False
Комментарии:
1. Как насчет 2
for
цикла?
Ответ №1:
Может быть, что-то вроде этого?
data = [['X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' '], ['X', ' ', 'X', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' '], ['X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '], ['X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'X'], [' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
def check_valid(x, y, row, col):
#check left and right column
for i in range(row):
#if out of range or any character is not 'X' then return wrong pattern
if x i >= len(data) or data[x i][y] != 'X':
return False
#check top and bottom row
for i in range(col):
#same as above
if y i >= len(data[0]) or data[x][y i] != 'X':
return False
#also we need to check the middle must all be ' '
for i in range(1, row - 1):
for j in range(1, col - 1):
if data[x row][y col] != ' ':
return False
return True
for x in range(len(data)):
for y in range(len(data[0])):
if check_valid(x, y, 4, 3):
print(x,y)
Вывод:
0 0
1 11
2 14
Комментарии:
1. Может быть, вы можете немного объяснить это?
2. Первый цикл заключается в проверке левого столбца и правого столбца, второй цикл заключается в проверке верхней строки и нижней строки
3. Что я здесь делаю, так это проверяю для каждой позиции (x, y) из входной матрицы, содержит ли прямоугольник от (x, y) до (x 3, y 2) допустимый шаблон
4. Таким образом, шаблон недействителен, если какой-либо символ в ограничивающей рамке этого прямоугольника не является ‘X’ или прямоугольник не полностью входит в матрицу
5. Редактировать: я просто замечаю, что середина прямоугольника также должна быть заполнена
.
поэтому я обновил свой ответ, если это не важно, вы можете удалить последнюю часть.