Estoy intentando devolver los elementos que forman un cuadrado alrededor de otro elemento específico. Por ejemplo:
square_ele('j', [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i' , 'j', 'k', 'l'], ['m', 'n', 'o', 'p']])
Debería devolver los elementos que forman un cuadrado alrededor de 'j':
['e', 'f', 'g', 'i', 'k', 'm', 'n', 'o']
Intenté devolver elemento[ele-1]/elemento[ele+1]... y cosas así pero no funciona.
¿Alguien puede ayudarme?
¿Podrías ser más claro? ¿Qué es un cuadrado en este caso? que es elemento? y ele ?
- Iván
28/03/2021 a las 14:38
elemento como: para el elemento en la lista1, y ele como: para ele en el elemento. Y el cuadrado son los índices que son adyacentes horizontal, vertical y diagonalmente al elemento específico
-Annie Petrova
28/03/2021 a las 14:47
------------------------------------
encontrar el objetivo buscando en los elementos de la cuadrícula uno por uno y obtener sus coordenadas
interactuar con sus vecinospor coordenadas y no olvide omitir el vecino que no existe (por ejemplo, la letra 'a' tiene solo tres vecinos)
def square_ele(tgt, grid):
tgt_x, tgt_y = -1, -1
for row_idx, row in enumerate(grid):
for col_idx, element in enumerate(row):
if element == tgt:
tgt_x, tgt_y = row_idx, col_idx
neighbour = []
for row_offset in range(-1, 2):
for col_offset in range(-1, 2):
# skip target itself
if row_offset == 0 and col_offset == 0:
continue
# when target sits on the corners skip neighbour that does not exist
if tgt_x + row_offset < 0 or tgt_x + row_offset > len(grid):
continue
if tgt_y + col_offset < 0 or tgt_y + col_offset > len(grid[0]):
continue
neighbour.append(grid[tgt_x + row_offset][tgt_y + col_offset])
return neighbour
2
¿¡Podrías ser más específico acerca de tus objetivos proporcionando un ejemplo muy sencillo!? Esto se llama ejemplo mínimo reproducible.
- mccurcio
28/03/2021 a las 15:56
1
mi código devuelve lo mismo que requiere la pregunta
- li6in9muyou
1 de julio de 2021 a las 16:02
------------------------------------
Algo como esto:
def f(letter, lst):
for i in range(len(lst)):
for j in range(len(lst[i])):
if lst[i][j] == letter:
return lst[i-1][j-1:j+2] + [lst[i][j-1]] + [lst[i][j+1]] + lst[i+1][j-1:j+2]
2
no devuelve las diagonales
-Annie Petrova
28/03/2021 a las 15:24
¡Qué mal! Debería arreglarse ahora
-Seppeke
28/03/2021 a las 15:25
------------------------------------
Si se garantiza que su cuadrado siempre estará formado a partir de un subconjunto del alfabeto en minúsculas, y que para cada letra l y su índice i en el cuadrado aplanado, i = len(cuadrado_plano) - 1 | flat_square[i+1] = alfabeto[i+1]:
import string
def square_vals(v, square):
x, y = (k:=string.ascii_lowercase.index(v))//(l:=len(square[0])), k%l
if x:
yield from square[x-1][y-1:y+2]
yield from [*square[x][y-1:y], *square[x][y+1:y+2]]
if x+1 < len(square):
yield from square[x+1][y-1:y+2]
print(list(square_vals('j', [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i', 'j', 'k', 'l'], ['m', 'n', 'o', 'p']])))
Salida:
['e', 'f', 'g', 'i', 'k', 'm', 'n', 'o']