如何产生多于一个列表,一个列表中,使用蟒蛇的功能

0

的问题

我想让一个8拼图解决问题采用不同的算法,如BFS、DFS、*等。 使用蟒蛇。 对于那些不熟悉的问题,8谜问题是一个游戏组成的3行和3列。 你可以移动的空瓦只有水平或垂直,0代表的空瓦。 它看起来像这样(我不能添加的图像由于我的帐户信誉。):

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

我的问题是这样的,我想要功能"find_new_nodes(国家)"返回2不同的列表,因此我可以选择最有前途的节点,根据不同的算法)等。 但是输出的我的代码中包括两个完全相同的名单。

这是我的输出: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

我能做些什么,以使其返回2不同的列表? 我的目标是向返回的所有可能的行动取决于0,使用find_new_nodes功能。 道歉如果这是一个简单的问题,这是我第一次使一个项目这个复杂。

3

最好的答案

1

问题是, swap_positions 获得参考的全球 initial_state 而不是克隆。 所以,这两个呼叫 swap_positions 变异同阵列。 一个解决方案将是克隆的阵列的第一个电话: right = swap_positions(initial_state[:],0,1)

可能一个更好的解决方案 swap_positions 还将:

# 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

也参看 在这里

2021-11-22 13:05:24
0

你真的没有"两个相同的名单",你只有一个表象,即你在返回的两倍。 为了避免修改原始名单,还有两个工作与不同的列表,则应该通过副本身。

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

附注1:我已经改名为你vairable liststates否则它会影置在名单的功能

侧注2: find_new_nodes 没有工作的参数,而不是它采用全球列表。 我改变了这一点。

附注3:有不同的方式来创建一个副本(较浅)清单。 我认为 list.copy() 是的最详细的一个。 你也可以使用复制的模块,使用 [:] 或别的东西。

输出:

([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,首先,一些想法...

  1. 尽量不要使用"清单"作为一个变量,这是一个Python标识"列表"的类型。 看来你是重新界定的术语。

  2. 通常,这是一个糟糕的想法利用全球vars如loc_of_zero.

关于你的问题:

我认为,问题是,您是得到了很多引用的同一变量。 尽量避免。 一个想法:

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

其他语言

此页面有其他语言版本

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