¿Cómo devolver los elementos alrededor de otro elemento en una lista de Python?

CorePress2024-01-25  13

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']
   

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare