如何将python列表动态传递给另一个python-fi

2024-09-30 20:20:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pygame开发一个N-Queen模拟程序。在

class NQ:

    def __init__(self,n):
        self.size = n
        self.columns = [] * self.size
        self.places = 0
        self.backtracks = 0

    def place(self, startRow=0): 
        if len(self.columns) == self.size:

            return self.columns


        else:
            for row in range(startRow, self.size): 
                if self.isSafe(len(self.columns), row) is True: 
                    self.columns.append(row)
                    self.places += 1 
                    return self.place()

            else: 
                lastRow = self.columns.pop()
                self.backtracks += 1 
                return self.place(startRow=lastRow + 1)

    def isSafe(self, col, row): 
        for threatRow in self.columns: 
            threatCol = self.columns.index(threatRow) 
            if row == threatRow or col == self.columns.index(threatRow):
                return False 
            elif threatRow + threatCol == row + col or threatRow - threatCol == row - col:
                return False 
        return True

    def process(n):

        nqueens = NQ(n)
        nqueens.place(0)
        return nqueens.columns

作为另一个棋盘输入程序,它们也相应地作为一个棋盘输入。 如果我想显示皇后区的移动,如何从递归code过程动态传递列表,以便可以看到确切的回溯过程。 谢谢你


Tags: columnsselfsizereturnifdefplacecol
3条回答

如果我理解正确,您只需要将基本python类型的列表传递给另一个python进程,您希望从这里调用它。您可以使用任何序列化和反序列化的方法。在

一个简单的方法是(如果您的列表真的只包含诸如int、float、string等基本类型)使用JSON

import json
import subprocess

list_to_transfer = [1,2,"sdf",5.6]
list_as_string = json.dumps(list_to_transfer)

subprocess.call("other_executable \"%s\"" % list_as_string, shell=True)

在另一个过程中,只需通过doin反序列化

^{pr2}$

我没试过那个代码,也许它不能运行,但主要思想应该很清楚。在

如果在同一目录中有两个文件,则可以执行以下操作:

  • 文件1.py

    def function1(list):
        print(list)
    
  • 文件2.py

    import file1
    file1.function1(['hallo'])
    

您可以使用import进行此操作。在

如果你想知道递归函数内部发生了什么,你可以添加外部函数作为参数,然后你可以在递归内部使用它来打印算法的当前状态或在棋盘上画皇后。在

在示例中,我使用show_colums()在每次self.place()运行时打印self.columns。在

文件:不合格品在

class NQ:

    def __init__(self,n, callback): # added callback
        self.size = n
        self.columns = []
        self.places = 0
        self.backtracks = 0
        self.callback = callback # added callback

    def place(self, startRow=0): 

        self.callback(self.columns) # added callback

        if len(self.columns) == self.size:

            return self.columns

        else:
            for row in range(startRow, self.size): 
                if self.isSafe(len(self.columns), row) is True: 
                    self.columns.append(row)
                    self.places += 1 
                    return self.place()

            else: 
                lastRow = self.columns.pop()
                self.backtracks += 1 
                return self.place(startRow=lastRow + 1)

    def isSafe(self, col, row): 
        for threatRow in self.columns: 
            threatCol = self.columns.index(threatRow) 
            if row == threatRow or col == self.columns.index(threatRow):
                return False 
            elif threatRow + threatCol == row + col or threatRow - threatCol == row - col:
                return False 
        return True

文件:主.py在

^{pr2}$

部分结果

columns: []
columns: [0]
columns: [0, 2]
columns: [0, 2, 4]
columns: [0, 2, 4, 1]
columns: [0, 2, 4, 1, 3]
columns: [0, 2, 4, 1]
columns: [0, 2, 4, 1, 7]
columns: [0, 2, 4, 1]

相关问题 更多 >