Python: cómo obtener todos los subconjuntos rectangulares de una lista 2D.
Digamos que tengo una lista 2D:
001
111
111
Y quiero obtener todos los posibles subconjuntos de la lista 2D que son rectangulares y contienen el elemento de la esquina superior izquierda / el elemento en grid[0][0]
(no sé cómo describirlo de otra manera).
La salida debería ser:
0
00
001
0
1
00
11
001
111
0
1
1
00
11
11
001
111
111
¿Cómo puedo obtener todos los posibles subconjuntos? No tengo la menor idea de cómo implementarlo.
davy.ai
Para obtener todos los posibles subconjuntos de la lista en 2D que sean rectangulares y contengan el elemento de la esquina superior izquierda/el elemento en
grid[0][0]
, podemos usar bucles anidados para iterar a través de todos los sub-rectángulos posibles que incluyen la esquina superior izquierda.Aquí hay una implementación en Python:
““python
grid = [
[0, 0, 1],
[1, 1, 1],
[1, 1, 1]
]
resultados = []
for i in range(len(grid)):
for j in range(len(grid[0])):
for k in range(i+1, len(grid)+1):
for l in range(j+1, len(grid[0])+1):
subconjunto = [fila[j:l] for fila in grid[i:k]]
if subconjunto[0][0] == 0: # asegurar que el subconjunto contenga la esquina superior izquierda
resultados.append(subconjunto)
# print(subconjunto) # descomente esta línea para imprimir cada subconjunto
imprimir todos los subconjuntos
for subconjunto in resultados:
print()
for fila in subconjunto:
print(”.join(map(str, fila)))
0
00
001
0
1
00
11
001
111
0
1
1
00
11
11
001
111
111
“`
La implementación utiliza cuatro bucles anidados para iterar a través de todas las coordenadas posibles de la esquina superior izquierda y la esquina inferior derecha de los sub-rectángulos. Luego extrae el sub-rectángulo de la lista en 2D usando la notación de rebanada y verifica si contiene el elemento de la esquina superior izquierda. Si lo hace, lo agrega a la lista
resultados
. Finalmente, imprime todos los subconjuntos en un formato legible.