Cómo generar más de una lista de una lista, utilizando funciones python

0

Pregunta

Estoy tratando de hacer un 8 puzzle solver del problema el uso de diferentes algoritmos, tales como BFS,DFS, UN* etc. usando python. Para aquellos que no están familiarizados con el problema, de 8 puzzle el problema es un juego que consta de 3 filas y 3 columnas. Puede mover el azulejo vacío sólo horizontalmente o verticalmente, 0 representa el azulejo vacío. Se parece a esto (no pude agregar las imágenes debido a mis cuentas reputación.):

https://miro.medium.com/max/679/1*yekmcvT48y6mB8dIcK967Q.png

initial_state = [0,1,3,4,2,5,7,8,6]
goal_state = [1,2,3,4,5,6,7,8,0]
    
def find_zero(state):
       global loc_of_zero
       loc_of_zero = (state.index(0))


def swap_positions(list, pos1, pos2):
       first = list.pop(pos1)
       second = list.pop(pos2-1)

       list.insert(pos1,second)
       list.insert(pos2,first)
       return list

 def find_new_nodes(state):
      if loc_of_zero == 0:
         right = swap_positions(initial_state,0,1)
         left = swap_positions(initial_state,0,3)
         return(right,left)




find_zero(initial_state)
print(find_new_nodes(initial_state))   

El problema que tengo es este, quiero la función "find_new_nodes(estado)" return 2 listas diferentes, así que puede elegir el más prometedor nodo, dependiendo del algoritmo) y así sucesivamente. Pero la salida de mi código consta de dos idénticos listas.

Este es mi resultado: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

¿Qué puedo hacer para hacerla volver 2 listas diferentes? Mi objetivo es devolver todos los movimientos posibles, dependiendo de donde el 0 es decir, con el find_new_nodes función. Disculpas si esto es una pregunta fácil, Esta es mi primera vez haciendo un proyecto de este complicado.

3

Mejor respuesta

1

El problema es que swap_positions obtiene una referencia al mundial initial_state y no un clon de ella. Por lo tanto las llamadas a swap_positions mutar la misma matriz. Una solución sería clon de la matriz en la primera llamada: right = swap_positions(initial_state[:],0,1)

probablemente la mejor solución para swap_positions también sería:

# please do not name variables same as builtin names
def swap_positions(lis, pos1, pos2):
       # create a new tuple of both elements and destruct it directly
       lis[pos1], lis[pos2] = lis[pos2], lis[pos1]
       return lis

ver también aquí

2021-11-22 13:05:24
0

Usted realmente no tiene "dos idénticos lista", sólo tiene un objeto de la lista que está devolviendo el doble. Para evitar la modificación de la lista original y también dos listas diferentes, debe pasar de copias en todo.

initial_state = [0,1,3,4,2,5,7,8,6]
goal_state = [1,2,3,4,5,6,7,8,0]

def find_zero(state):
    global loc_of_zero
    loc_of_zero = (state.index(0))


def swap_positions(states, pos1, pos2):
    first = states.pop(pos1)
    second = states.pop(pos2-1)

    states.insert(pos1,second)
    states.insert(pos2,first)
    return states

def find_new_nodes(states):
    if loc_of_zero == 0:
        right = swap_positions(states.copy(),0,1) # pass around a copy
        left = swap_positions(states.copy(),0,3) # pass around a copy
        return(right,left)

find_zero(initial_state)
print(find_new_nodes(initial_state))

Nota 1: he cambiado el nombre de tu vairable list a states, de lo contrario sería la sombra de la construcción en función de lista

Nota 2: find_new_nodes no funciona con el parámetro, en lugar utilizó la lista mundial. He cambiado también.

Nota 3: Hay diferentes maneras de crear una copia de su (escasa) de la lista. Creo list.copy() es el más detallado de uno. También se podría utilizar el módulo de copia, uso [:] o algo más.

Salida:

([1, 0, 3, 4, 2, 5, 7, 8, 6], [4, 1, 3, 0, 2, 5, 7, 8, 6])
2021-11-22 13:06:24
0

Ok, primero que todo, algunos pensamientos...

  1. Trate de no utilizar "lista" como una variable, es una de Python identificador de tipo "lista". Parece que están redefiniendo el término.

  2. Por lo general, es una mala idea usar variables globales, tales como loc_of_zero.

Sobre tu problema:

Yo creo que el problema es que usted está recibiendo una gran cantidad de referencias de la misma variable. Tratar de evitarlo. Una idea:

from copy import deepcopy
def swap_positions(list0, pos1, pos2): 
    list1 = deepcopy(list0) 
    first = list1.pop(pos1) 
    second = list1.pop(pos2-1) 

    list1.insert(pos1,second) 
    list1.insert(pos2,first) 
    return list1 
2021-11-22 13:12:44

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................