Come generare più di una lista da un elenco, utilizzando le funzioni in python

0

Domanda

Sto cercando di fare un 8 puzzle solver di problema utilizzando algoritmi diversi, come BFS,DFS, UN* ecc. usando python. Per coloro che non hanno familiarità con il problema, 8 puzzle problema è un gioco composto da 3 righe e 3 colonne. È possibile spostare la piastrella vuota solo orizzontalmente o verticalmente, 0 rappresenta la piastrella vuota. Sembra che questo (non ho potuto aggiungere le immagini a causa del mio account reputazione.):

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))   

Il problema che ho è questo, io voglio la funzione "find_new_nodes(stato)" ritorno 2 liste diverse, quindi posso scegliere il più promettente nodo, a seconda dell'algoritmo) e così via. Ma l'uscita del mio codice è composto da due liste identiche.

Questo è il mio output: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

Cosa posso fare per farlo tornare 2 liste diverse? Il mio obiettivo è quello di restituire tutte le possibili mosse in base a dove lo 0 è, utilizzando il find_new_nodes funzione. Mi scuso se questa è una domanda facile, Questo è il mio primo progetto di questo complesso.

3

Migliore risposta

1

Il problema è che swap_positions ottiene un riferimento al globale initial_state e non un clone di esso. Così entrambe le chiamate per swap_positions mutare la stessa matrice. Una soluzione potrebbe essere quella di clonare l'array in prima convocazione: right = swap_positions(initial_state[:],0,1)

probabilmente una soluzione migliore per swap_positions inoltre sarebbe:

# 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

vedi anche qui

2021-11-22 13:05:24
0

Davvero non hai "due identici lista", si dispone solo di un elenco di oggetti che si otterrà il doppio. Per evitare di modificare l'elenco originale e anche due opere con diverse liste, si dovrebbe passare di copie in tutto.

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: ho rinominato il vairable list per statesaltrimenti sarebbe come un'ombra il costruito in funzione di elenco

Nota a margine 2: find_new_nodes non ha funzionato con il parametro, invece ha usato l'elenco globale. Ho cambiato anche quello.

Nota 3: Ci sono diversi modi per creare una copia del tuo (di poco) l'elenco. Penso list.copy() è il più dettagliato uno. Si potrebbe anche utilizzare il modulo di copia, uso [:] o qualcos'altro.

Output:

([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, prima di tutto, alcuni pensieri...

  1. Cercate di non utilizzare la "lista" come una variabile, è un Pitone identificatore di tipo "list". Sembra che si sta ridefinendo il termine.

  2. Di solito, è una cattiva idea usare variabili globali come loc_of_zero.

Circa il tuo problema:

Credo che il problema è che si stanno ottenendo un sacco di riferimenti di una stessa variabile. Cercate di evitare di farlo. 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

In altre lingue

Questa pagina è in altre lingue

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