Comment générer plus d'une liste à partir d'une liste, à l'aide de fonctions python

0

La question

Je suis en train de faire un 8 puzzle de la résolution de problèmes à l'aide de différents algorithmes, tels que la BFS,DFS, UN* etc. à l'aide de python. Pour ceux qui ne sont pas familiers avec le problème, 8 puzzle problème est un jeu composé de 3 lignes et 3 colonnes. Vous pouvez déplacer la tuile vide uniquement à l'horizontale ou à la verticale, 0 représente la tuile vide. Il ressemble à ceci (je ne pouvais pas ajouter des images due à mes comptes réputation.):

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

Le problème que j'ai est cela, je veux que la fonction "find_new_nodes(état)" retour de 2 listes différentes, j'ai donc le choix le plus prometteur nœud, en fonction de l'algorithme) et ainsi de suite. Mais la sortie de mon code se compose de deux listes identiques.

C'est ma sortie: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

Que puis-je faire pour le faire revenir 2 listes différentes? Mon but est de retourner tous les coups possibles, selon l'endroit où 0 est, à l'aide de la find_new_nodes fonction. Toutes mes excuses si c'est une question facile, C'est ma première fois de faire un projet de cette complexité.

3

La meilleure réponse

1

Le problème est que swap_positions obtient une référence pour le mondial initial_state et pas un clone d'elle. Donc, les deux appels à swap_positions muter le même tableau. Une solution serait de cloner le tableau sur le premier appel: right = swap_positions(initial_state[:],0,1)

sans doute une meilleure solution pour swap_positions seraient également:

# 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

voir aussi ici

2021-11-22 13:05:24
0

Vous n'avez pas vraiment "deux identiques liste", vous n'avez qu'une liste d'objet que vous êtes de retour deux fois. Pour éviter de modifier la liste d'origine et également deux travailler avec les différentes listes, vous devez passer les copies autour de.

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

Note 1: j'ai renommé votre vairable list pour states, sinon, il serait de l'ombre le construit en fonction de liste

Remarque 2: find_new_nodes ne fonctionne pas avec le paramètre, au lieu de cela il a utilisé la liste globale. J'ai changé, aussi.

Remarque 3: Il existe différentes façons de créer une copie de votre (peu profonde) de la liste. Je pense list.copy() est le niveau le plus détaillé de l'un. Vous pouvez également utiliser le module de copie, l'utilisation [:] ou quelque chose d'autre.

Sortie:

([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, tout d'abord, quelques réflexions...

  1. Essayez de ne pas utiliser "liste" comme une variable, c'est un Python identificateur de la liste " type de. Il semble que vous sont en train de redéfinir le terme.

  2. Généralement, c'est une mauvaise idée d'utiliser les variables globales telles que loc_of_zero.

Au sujet de votre problème:

Je crois que le problème c'est que vous avez un grand nombre de références de la même variable. Essayez de l'éviter. Une idée:

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

Dans d'autres langues

Cette page est dans d'autres langues

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