Path: csiph.com!usenet.pasdenom.info!news.etla.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed4a.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.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'operator': 0.03; 'pop': 0.05; 'attribute': 0.07; 'great.': 0.07; 'modified': 0.07; 'modify': 0.07; 'none,': 0.07; 'instance.': 0.09; 'iterate': 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'spec': 0.09; 'works.': 0.09; 'def': 0.12; 'random': 0.14; 'posted': 0.15; 'add(self,': 0.16; 'attribute.': 0.16; 'dict': 0.16; 'did.': 0.16; 'heap': 0.16; 'node.': 0.16; 'nodes': 0.16; 'pop()': 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; 'subject:which': 0.16; 'sync': 0.16; 'appropriate': 0.16; 'wrote:': 0.18; 'trying': 0.19; 'import': 0.22; 'header:User- Agent:1': 0.23; 'initial': 0.24; 'header:X-Complaints-To:1': 0.27; 'function': 0.29; 'robert': 0.30; 'node': 0.31; 'pos': 0.31; 'values.': 0.31; 'allows': 0.31; 'class': 0.32; 'skip:_ 10': 0.34; 'maybe': 0.34; 'info': 0.35; 'classes': 0.35; 'but': 0.35; 'add': 0.35; 'subject:data': 0.36; 'method': 0.36; 'thanks': 0.36; 'subject:?': 0.36; 'should': 0.36; 'to:addr:python-list': 0.38; 'delete': 0.39; 'sure': 0.39; 'to:addr:python.org': 0.39; 'changed': 0.39; 'received:org': 0.40; 'remove': 0.60; 'first': 0.61; 'realized': 0.68; 'lowest': 0.74; 'peter,': 0.84; 'swift': 0.91; 'contrary': 0.95 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 19:39:33 +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: 79 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1390329556 news.xs4all.nl 2882 [2001:888:2000:d::a6]:36243 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:64437 Robert Voigtländer wrote: > >> > > def pop(self): >> > > f, node = heapq.heappop() >> > > del lookup[node.pos] >> > > return node > >> > That should be >> >> > def pop(self): >> >> > f, node = heapq.heappop(self.heap) >> > del self.lookup[node.pos] >> > return node >> >> Hi Peter, >> this works great. I will try to find some info about the functionality >> you used and to understnad what you did. Maybe you can add a function to >> remove a node? Thanks for your support and all tthe swift answers. >> >> Robert > > Just realized what the pop function is for. I changed it from: > def pop(self): > to > def pop(self,pos): > > and it works. Unlikely. Are you sure that .heap and .lookup contents are still in sync with your modification? > Now I go on with trying to understand it. The pop() method as posted can only remove the "lowest" node. If contrary to your initial spec > 2. find the object with the lowest Node.f attribute and update or remove it you want to remove arbitrary nodes a heap may not be the appropriate data structure. The modified import operator #... class Nodes(): def __init__(self): self.lookup = {} def add(self, node): self.lookup[node.pos] = node def __iter__(self): return iter(self.lookup.itervalues()) def __contains__(self, pos): return pos in self.lookup def lowest(self): return min(self, key=operator.attrgetter("f")) def __delitem__(self, pos): del self.lookup[pos] 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)) del nodes[1, 2] allows you to delete random nodes, but the lowest() method will slow down as it has to iterate over all dict values. One important caveat: both Nodes classes lead to data corruption if you modify a .pos attribute while the node is in a Nodes instance. The same goes for the first implementation and the .f attribute.