Como gerar mais de uma lista a partir de uma lista, usando python funções

0

Pergunta

Eu estou tentando fazer um 8 de quebra-cabeça solucionador de problemas usando diferentes algoritmos, tais como BFS,DFS, UM* etc. utilizando python. Para aqueles que não estão familiarizados com o problema, de 8 de puzzle problema é um jogo que consiste em 3 linhas e 3 colunas. Você pode mover o vazio telha apenas na horizontal ou na vertical, 0 representa o vazio da telha. Ele se parece com isso (eu não poderia adicionar as imagens, devido às minhas contas reputação.):

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

O problema que eu tenho é esse, eu quero a função "find_new_nodes(estado)" return 2 listas diferentes, para que eu possa escolher o mais promissor nó, dependendo do algoritmo) e assim por diante. Mas a saída do meu código é composto de duas listas idênticas.

Esta é a minha saída: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

O que posso fazer para ele voltar 2 listas diferentes? Meu objetivo é retornar todos os movimentos possíveis, dependendo de onde o 0 é, usando o find_new_nodes função. Desculpas se isso é uma pergunta fácil, Esta é a minha primeira vez fazendo um projeto complicado.

3

Melhor resposta

1

O problema é que swap_positions obtém uma referência para o global initial_state e não um clone dele. Para tanto chama para swap_positions mutar a mesma matriz. Uma solução seria clone matriz na primeira chamada: right = swap_positions(initial_state[:],0,1)

provavelmente a melhor solução para swap_positions poderia ser também:

# 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

veja também aqui

2021-11-22 13:05:24
0

Você realmente não tem "dois idênticos lista", você só tem uma lista de objeto que você está retornando duas vezes. Para evitar modificar a lista original e também trabalhar com diferentes listas, você deve passar de cópias ao redor.

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: eu tenho mudado seu vairable list para states, caso contrário, ele seria sombra construído em função de lista de

Nota 2: find_new_nodes não trabalho com o parâmetro, em vez disso, é usado na lista global. Eu mudei também.

Nota 3: Existem diferentes maneiras para criar uma cópia de sua (rasa) de lista. Eu acho list.copy() é o mais detalhado de um. Você também pode usar o módulo de cópia, utilização [:] ou outra coisa.

Saída:

([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, primeiro de tudo, alguns pensamentos...

  1. Tente não usar "lista" como uma variável, é um Python identificador do tipo "list". Parece que você está redefinindo o termo.

  2. Normalmente, é uma má idéia usar variáveis globais, tais como loc_of_zero.

Sobre o seu problema:

Eu acredito que o problema é que você está recebendo uma grande quantidade de referências da mesma variável. Tentar evitá-lo. Uma ideia:

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

Em outros idiomas

Esta página está em outros idiomas

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