Cum de a genera mai mult de o listă dintr-o listă, folosind python funcții

0

Problema

Eu sunt încercarea de a face o 8 puzzle rezolvare a problemelor folosind diferite algoritmi, cum ar fi BFS,DFS, O* etc. folosind python. Pentru cei care nu sunt familiarizați cu această problemă, 8 problema puzzle este un joc format din 3 rânduri și 3 coloane. Puteți muta țiglă gol numai pe orizontală sau pe verticală, 0 reprezintă țiglă gol. Se pare ca acest lucru (nu am putut adauga imagini din conturile mele reputația.):

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

Problema pe care o am este aceasta, vreau funcția "find_new_nodes(de stat)" return 2 liste diferite, deci nu pot alege cele mai promițătoare nod, în funcție de algoritmul) și așa mai departe. Dar de ieșire de codul meu este format din două liste identice.

Acest lucru este meu de ieșire: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

Ce pot face pentru a face să se întoarcă 2 liste diferite? Scopul meu este de a reveni toate mișcările posibile în funcție de unde 0 este, folosind find_new_nodes funcție. Scuze daca este o intrebare usoara, Aceasta este prima oară când fac un proiect atât de complicat.

3

Cel mai bun răspuns

1

Problema este că swap_positions obține o referință la nivel mondial initial_state și nu o clonă de ea. Deci ambele apeluri la swap_positions evolua în aceeași serie. O soluție ar fi clona matrice la primul apel: right = swap_positions(initial_state[:],0,1)

probabil o soluție mai bună pentru swap_positions ar fi, de asemenea,:

# 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

a se vedea, de asemenea, aici

2021-11-22 13:05:24
0

Nu prea am "două identice listă", ai doar o lista de obiecte care te întorci de două ori. Pentru a evita modificarea lista inițială și, de asemenea, două de lucru cu liste diferite, ar trebui să treacă de exemplare în întreaga.

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: am redenumit vairable list pentru a states, în caz contrar s-ar umbră construit în funcție de lista de

Notă 2: find_new_nodes nu a mers cu parametru, în schimb s-a folosit de listă la nivel mondial. Am schimbat, de asemenea.

Nota 3: Există diferite moduri de a crea o copie a (superficial) lista. Cred list.copy() este cel mai detaliată unul. Ai putea folosi, de asemenea, copia modul de utilizare [:] sau altceva.

Ieșire:

([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, mai întâi de toate, niște gânduri...

  1. Încercați să nu folosiți "lista", ca o variabilă, este un Piton de identificare pentru "lista" de tip. Se pare că ești redefinirea termenului.

  2. De obicei, e o idee rea sa folosesti global vars, cum ar fi loc_of_zero.

Despre problema ta:

Eu cred că problema este că vă sunt obtinerea o mulțime de referințe de aceeași variabilă. Încercați să-l evite. O idee:

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

În alte limbi

Această pagină este în alte limbi

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