Python işlevlerini kullanarak bir listeden birden fazla liste nasıl oluşturulur

0

Soru

BFS, DFS, A * vb. Gibi farklı algoritmalar kullanarak 8 bulmaca problem çözücü yapmaya çalışıyorum. python kullanarak. Soruna aşina olmayanlar için, 8 bulmaca problemi 3 satır ve 3 sütundan oluşan bir oyundur. Boş döşemeyi yalnızca yatay veya dikey olarak taşıyabilirsiniz, 0 boş döşemeyi temsil eder. Şuna benziyor (hesaplarımın itibarı nedeniyle görüntüleri ekleyemedim.):

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

Sahip olduğum sorun şudur: "find_new_nodes(state)" işlevinin 2 farklı liste döndürmesini istiyorum, böylece algoritmaya bağlı olarak en umut verici düğümü seçebilirim) vb. Ancak kodumun çıktısı iki özdeş listeden oluşuyor.

Bu benim çıktımdır: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

2 Farklı liste döndürmesi için ne yapabilirim? Amacım, find_new_nodes işlevini kullanarak 0'ın nerede olduğuna bağlı olarak olası tüm hareketleri döndürmektir. Bu kolay bir soru ise özür dilerim, Bu benim ilk defa bir projeyi bu kadar karmaşık hale getiriyorum.

3

En iyi cevabı

1

Sorun bu swap_positions genel bir başvuru alır initial_state ve bunun bir klonu değil. Yani her ikisi de swap_positions aynı diziyi değiştir. Bir çözüm, ilk çağrıda diziyi klonlamak olacaktır: right = swap_positions(initial_state[:],0,1)

muhtemelen daha iyi bir çözüm swap_positions ayrıca olurdu:

# 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

ayrıca buraya bakın

2021-11-22 13:05:24
0

Gerçekten "iki özdeş liste" ye sahip değilsiniz, yalnızca iki kez döndürdüğünüz bir liste nesneniz var. Farklı listeler ile iki iş orijinal liste ve ayrıca değiştirme önlemek için, etrafında kopya geçmesi.

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

Yan not 1: Vairable'ınızı yeniden adlandırdım list -e doğru states aksi takdirde, yerleşik liste işlevini gölgeleyecektir

Yan not 2: find_new_nodes parametreyle çalışmadı, bunun yerine genel listeyi kullandı. Değiştirdim de.

Yan not 3: (Sığ) listenizin bir kopyasını oluşturmanın farklı yolları vardır. Sanırım list.copy() en ayrıntılı olanıdır. Kopyalama modülünü de kullanabilirsiniz [:] ya da başka bir şey.

Çıktı:

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

Tamam, her şeyden önce, bazı düşünceler...

  1. "Liste" yi değişken olarak kullanmamaya çalışın, bu "liste" türü için bir Python tanımlayıcısıdır. Terimi yeniden tanımlıyor gibisin.

  2. Genellikle, loc_of_zero gibi global var'ları kullanmak kötü bir fikirdir.

Sorunun hakkında:

Sorunun, aynı değişkenin çok sayıda referansını aldığınıza inanıyorum. Bunu önlemek için deneyin. Bir fikir:

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

Diğer dillerde

Bu sayfa diğer dillerde

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