Jak utworzyć więcej niż jednej listy z listy za pomocą funkcji pythona

0

Pytanie

Staram się stworzyć solver zadań z 8 zagadek, stosując różne algorytmy,takie jak BFS, DFS, A*, itp., za Pomocą pythona. Dla tych, którzy nie są zaznajomieni z problemem, 8 zadań-zagadek-gra składająca się z 3 wierszy i 3 kolumn. Można przenieść pustą płytkę tylko w poziomie lub w pionie, 0 jest pusty, płytki. To wygląda tak (nie mogłem dodać zdjęcia z powodu reputacji moich kont).:

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

Problem mam taki, chcę, aby funkcja "find_new_nodes(stan)" do zwracania 2 różne listy, żebym mógł wybrać najbardziej obiecujący zespół, w zależności od algorytmu) i tak dalej. Ale wniosek mojego kodu składa się z dwóch takich samych list.

To mój wynik: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

Co mogę zrobić, aby oddał 2 różne listy? Mój cel-odzyskać wszystkie możliwe ruchy w zależności od tego, gdzie znajduje się 0, korzystając z funkcji find_new_nodes. Przepraszam, jeśli to proste pytanie, ale po raz pierwszy robię projekt tak trudne.

3

Najlepsza odpowiedź

1

Problem w tym, że swap_positions dostaje link na globalną initial_state i nie jest jego klonem. Dlatego oba telefony w swap_positions мутируйте jeden i ten sam szyk. Rozwiązaniem byłoby sklonować tablica przy pierwszym wywołaniu: right = swap_positions(initial_state[:],0,1)

chyba najlepsze rozwiązanie swap_positions byłoby również:

# 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

zobacz także tutaj

2021-11-22 13:05:24
0

W rzeczywistości nie ma dwóch takich samych list", masz tylko jeden element listy, który zwracasz dwukrotnie. Aby uniknąć zmiany pierwotnej listy, a także pracy z dwoma różnymi listami, należy przesłać kopie w kółko.

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

Uwaga 1: przemianowano twój vairable list Dla statesw przeciwnym razie to затенит wbudowaną funkcję listy

Uwaga 2: find_new_nodes nie działa z parametrem, zamiast tego użył globalna lista. To ja też się zmienił.

Uwaga 3: Istnieją różne sposoby tworzenia kopii (płytką) listy. Myślę list.copy() jest to najbardziej rozwlekły (ang. verbose z nich. Można również użyć moduł kopiowania, należy użyć [:] czy coś jeszcze.

Wyjście:

([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

Dobra, przede wszystkim, pewne myśli...

  1. Staraj się nie używać "lista" jako zmiennej, to identyfikator Python typu "lista". Chyba переосмысливаете ten termin.

  2. Normalnie używać zmiennych globalnych, takich jak loc_of_zero, to zły pomysł.

O swoim problemie:

Uważam, że problem jest w tym, że masz dużo linków na tej samej zmiennej. Postaraj się tego uniknąć. Jeden pomysł:

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

W innych językach

Ta strona jest w innych językach

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