Path: csiph.com!usenet.pasdenom.info!gegeweb.org!usenet-fr.net!nerim.net!novso.com!newsfeed.xs4all.nl!newsfeed3a.news.xs4all.nl!xs4all!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.002 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; '21,': 0.07; 'attribute': 0.07; 'none,': 0.07; 'welcome.': 0.07; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'python': 0.11; 'def': 0.12; 'jan': 0.12; '(there': 0.16; 'add(self,': 0.16; 'algorithm.': 0.16; 'before.': 0.16; 'heapq': 0.16; 'nodes': 0.16; 'objects.': 0.16; 'received:80.91.229.3': 0.16; 'received:dip0.t-ipconnect.de': 0.16; 'received:plane.gmane.org': 0.16; 'received:t-ipconnect.de': 0.16; 'responded.': 0.16; 'sill': 0.16; 'subject:which': 0.16; ':-)': 0.16; 'wrote:': 0.18; 'code.': 0.18; 'do.': 0.18; 'solution.': 0.20; 'example': 0.22; 'import': 0.22; 'print': 0.22; 'header:User-Agent:1': 0.23; 'example.': 0.24; 'this:': 0.26; 'pass': 0.26; 'header:X-Complaints-To:1': 0.27; 'function': 0.29; 'chris': 0.29; 'robert': 0.30; 'code': 0.31; 'libraries': 0.31; 'node': 0.31; 'object.': 0.31; 'pos': 0.31; 'class': 0.32; 'skip:_ 10': 0.34; 'maybe': 0.34; 'skip:d 20': 0.34; 'info': 0.35; 'objects': 0.35; 'but': 0.35; 'there': 0.35; 'false': 0.36; 'processed': 0.36; 'subject:data': 0.36; 'done': 0.36; "didn't": 0.36; 'thanks': 0.36; 'subject:?': 0.36; 'should': 0.36; 'list': 0.37; 'list.': 0.37; 'clear': 0.37; 'implement': 0.38; 'lists.': 0.38; 'to:addr:python-list': 0.38; 'skip:- 10': 0.38; 'explain': 0.39; 'to:addr:python.org': 0.39; 'skip:p 20': 0.39; 'received:org': 0.40; 'remove': 0.60; 'skip:o 30': 0.61; 'new': 0.61; 'first': 0.61; 'skip:n 10': 0.64; 'pick': 0.64; 'provide': 0.64; 'more': 0.64; 'different': 0.65; 'chance': 0.65; 'here': 0.66; 'between': 0.67; 'lowest': 0.74; 'myself)': 0.84; 'partially': 0.84; 'mean.': 0.91 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Peter Otten <__peter__@web.de> Subject: Re: which data structure to use? Date: Tue, 21 Jan 2014 15:09:31 +0100 Organization: None References: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Gmane-NNTP-Posting-Host: p5084917c.dip0.t-ipconnect.de User-Agent: KNode/4.7.3 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 157 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1390313352 news.xs4all.nl 2933 [2001:888:2000:d::a6]:34494 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:64413 Robert Voigtländer wrote: > >> On Tue, Jan 21, 2014 at 03:17:43AM -0800, Robert Voigtl�nder wrote: >> > >> > I have objects like this: >> >> > >> >> > class Node(object): >> >> > def __init__(self, pos, parent, g , h): >> >> > self.pos = pos >> >> > self.parent = parent >> >> > self.g = g >> >> > self.h = h >> >> > self.f = g+h >> >> > >> >> > >> >> > I need to build a "list" of these objects. The amount is unknown. >> >> > On this list I need to regularly >> >> > >> >> > 1. check if a specific item - identified by Node.pos - is in the list. >> >> > 2. find the object with the lowest Node.f attribute and update or >> > remove it >> > > > First thanks to all who responded. Although I only partially understand > your answers as I am a Python starter. What's clear to me is the > difference between object and instance of an object. Just didn't explain > it well. > > Maybe I give some more info on what I need / want to do. I will also > provide a working code example. Should have done this before. > > I would very much appreciate a working example of what you mean. Then I > have a chance to understand it. :-) > > I would like to implement a class for a A* pathfinding algorithm. (there > are ready libraries out there but I would like to learn it myself) This > requires to maintain a list of nodes to be processed and nodes already > processed. For new nodes I need to check if they are on one of the lists. > I also need to regularly pick the node with the lowest value f from the > list. > > Here some working code. For one function I sill need a solution. Any > better solution is welcome. > > Thanks > Robert > > --------------- > 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 > > > def isinlist(nodeToSeatch): > for item in openlist: > if item.pos == nodeToSeatch: return True > return False > > > def lowestF(): > lowestF = '' > for item in openlist: > if item.f < lowestF: lowestF = item > return lowestF def lowestF(): return min(openlist, key=operator.attrgetter("f")) > def deleteItemWithPos(pos): > ## need this function or different approach > pass > > openlist=[] > openlist.append(Node((1,1),None,1,5)) > openlist.append(Node((1,2),(1,1),4,6)) > openlist.append(Node((1,3),(1,2),9,10)) > > for item in openlist: print item.pos, item.f > > print isinlist((1,1)) > print isinlist((1,5)) > > nextNode = lowestF() > print nextNode.pos, nextNode.f Here is an OO implementation of Chris Angelico's suggestion: import heapq 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 def __str__(self): return "Node(pos={!r}, f={!r})".format(self.pos, self.f) class Nodes(): def __init__(self): self.lookup = {} self.heap = [] def add(self, node): self.lookup[node.pos] = node heapq.heappush(self.heap, (node.f, node)) def __iter__(self): return iter(self.lookup.values()) def __contains__(self, pos): return pos in self.lookup def lowest(self): return self.heap[0][1] def pop(self): f, node = heapq.heappop() del lookup[node.pos] return node nodes = Nodes() nodes.add(Node((1,1), None, 1, 5)) nodes.add(Node((1,2), (1,1), 4, 6)) nodes.add(Node((1,3), (1,2), 9, 10)) for node in nodes: print(node) print((1,1) in nodes) print((1,5) in nodes) print(nodes.lowest())