python类对象添加+搜索最小/最大

时间:2014-01-21 08:22:35

标签: python object set

NI在Python中的Set中遇到了一些问题。

我有一个可以运行的测试脚本:

class node:
    def __init__(self, pos, parent, g , h):
        self.pos = pos
        self.parent = parent
        self.g = g
        self.h = h
        self.f = g+h

openlist=set()
openlist.add(node((1,1),None,1,5))

for node in openlist: print node.pos

我的实际代码不起作用

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm

class node:
    def __init__(self, pos, parent, g , h):
        self.pos = pos
        self.parent = parent
        self.g = g
        self.h = h
        self.f = g+h

class NewAMap(object):
    def __init__(self, size, start, target):
        self.size = size
        self.start = start
        self.target = target
        self.openlist = set()
        self.closedlist = set()
        self.EmptyValue = 0

        self.clear()
        self.addStart(self.start)
        self.addTarget(self.target)

    def clear(self):
        #self.OccMap = [[self.EmptyValue for i in xrange(self.sizeY)] for j in xrange(self.sizeX)]
        self.OccMap = np.zeros(shape=(self.size[0],self.size[1]),dtype=int)
    def display(self):
        print np.swapaxes(self.OccMap,0,1)
        #print self.open
        print self.closed
        self.PicMap = np.zeros(shape=(self.size[0],self.size[1]),dtype=(float,3))
        for x in xrange(0,self.size[0]):
            for y in xrange(0,self.size[1]):
                if self.OccMap[x][y] == 0:
                    self.PicMap[y][x]=(1,1,1)
                elif self.OccMap[x][y] == -1:
                    self.PicMap[y][x]=(0,0,0)
                elif self.OccMap[x][y] == -2:
                    self.PicMap[y][x]=(1,0,0)
                elif self.OccMap[x][y] == -3:
                    self.PicMap[y][x]=(0,0,1)
        #print self.PicMap
        plt.imshow(self.PicMap, interpolation='nearest')
        plt.show()

    def addBlocked(self, blockposs):
        self.OccMap[blockposs[0]][blockposs[1]]=-1
    def addStart(self, start):
        self.OccMap[start[0]][start[1]]=-2
    def addTarget(self, target):
        self.OccMap[target[0]][target[1]]=-3
    def calcRoute(self):
        self.openlist.add(node(self.start, None, 0, 0))
        for node in elfopenlist: print node.pos, node.parent, node.g, node.h, node.f


def main():
    AMap = NewAMap((20,20),(1,12),(12,12))
    for y in range(8,17): AMap.addBlocked((8,y))
    AMap.calcRoute()
    AMap.display()

if __name__ == '__main__':
    main()

失败并显示错误:UnboundLocalError:赋值前引用的局部变量'node' AMap.calcRoute()中发生错误:

self.openlist.add(node(self.start, self.none, 0, 0))

我认为那是因为我尝试使用NewAMap对象中的节点对象。但是我该怎么做呢?


我也想知道我:


1:检查对象是否在集合中

我想检查一个带有node.pos的对象是否在集合中。


2:搜索具有最低node.f值的集合中的对象。

我想在Set中搜索具有最低node.f值的对象。 Eventuelly将其从Set中删除或更新值。

我该怎么做?这是/正确的方法吗?


感谢
罗伯特

1 个答案:

答案 0 :(得分:0)

对于第一个问题,您可以做的是在文件顶部创建一个名为node_object的全局变量。您可以使用动态创建的节点对象重复引用它,并将其添加到开放列表中。

至于第二个,当然你可以做到这一点。查看sets in python的文档。但是,恕我直言,最好使用一种使用类似序列行为的不同数据结构 - 可能是一个列表,除非你想要处理元素的唯一性。