Path: csiph.com!usenet.pasdenom.info!news.etla.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed1a.news.xs4all.nl!xs4all!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.011 X-Spam-Evidence: '*H*': 0.98; '*S*': 0.00; '21,': 0.07; 'attribute': 0.07; 'modify': 0.07; '*args,': 0.09; 'insertion': 0.09; 'okay': 0.09; 'url:activestate': 0.09; 'def': 0.12; 'jan': 0.12; '**kwargs)': 0.16; '**kwargs):': 0.16; 'creation.': 0.16; 'dict': 0.16; 'objects.': 0.16; 'perhaps:': 0.16; 'sorts': 0.16; 'subject:which': 0.16; 'traverse': 0.16; 'modification': 0.16; 'wrote:': 0.18; 'import': 0.22; 'header:User-Agent:1': 0.23; 'sort': 0.25; 'this:': 0.26; 'gets': 0.27; 'header:In-Reply-To:1': 0.27; 'function': 0.29; 'url:code': 0.29; "doesn't": 0.30; 'robert': 0.30; 'work.': 0.31; 'keys': 0.31; 'node': 0.31; 'overhead': 0.31; 'pos': 0.31; 'class': 0.32; 'handled': 0.32; 'quite': 0.32; 'skip:_ 10': 0.34; 'problem': 0.35; 'something': 0.35; 'objects': 0.35; 'operate': 0.35; 'but': 0.35; 'received:google.com': 0.35; 'subject:data': 0.36; 'subject:?': 0.36; 'hi,': 0.36; 'list': 0.37; 'list.': 0.37; 'message- id:@gmail.com': 0.38; 'depends': 0.38; 'to:addr:python-list': 0.38; 'structure': 0.39; 'to:addr:python.org': 0.39; 'according': 0.40; 'how': 0.40; 'remove': 0.60; 'is.': 0.60; 'strictly': 0.61; 'content-disposition:inline': 0.62; 'skip:n 10': 0.64; 'chance': 0.65; 'lowest': 0.74; 'removal': 0.74; 'actions.': 0.84; 'case?': 0.84; 'oscar': 0.84; 'approach.': 0.91; 'received:mail- wi0-x229.google.com': 0.91 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:message-id:references:mime-version :content-type:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=WJtl1XKgEbgnffhJX2s8usvI1+jc8XmqtytT9wZsXJ8=; b=O2kEXC/JDmowukv8NBTlH+w7BU7COFT7EY9+VtDbI9NrzXAtguvQoHF3OgduvMkgn9 sIyLwHQ/wTsSEbsB/wHFmh1C5FnvkQY/QoynwSEdpzPRBUZkCR33dimnPicCHHxBgQQp vlBZetvzrjajFOLKr5rM1VAtmtLWVO4EZJKLOh6e3FBiTxg5k3cIn76kpgnTd+bX2yCK FzLHDP4t34P5/df2cJfNCQz7INZkUClCOBI9lmI5TTQyhLRtb1g75gLhhrULsya+Q2Ju KQDvYMErMqnt4GBvSmlG408uMOEE3z3bcuWMphPUeMiREA3lZSgkDqX/2PHOumK3PXG6 zClw== X-Received: by 10.194.71.47 with SMTP id r15mr5997189wju.19.1390304996847; Tue, 21 Jan 2014 03:49:56 -0800 (PST) Date: Tue, 21 Jan 2014 11:49:53 +0000 From: Oscar Benjamin To: python-list@python.org Subject: Re: which data structure to use? References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) 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: 57 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1390305003 news.xs4all.nl 2898 [2001:888:2000:d::a6]:57628 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:64405 On Tue, Jan 21, 2014 at 03:17:43AM -0800, Robert Voigtländer wrote: > Hi, > > which would be the best data structure to use for the following case? > > 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 > > > What would be a good approach. Using a list I always need to traverse the whole list to do one of the above actions. Is the order of the items in the list significant? If not you might try using a modification of this sorted dict recipe: http://code.activestate.com/recipes/576998-sorted-dictionary/ You would want to use node.pos as the key and node as the value but modify the _sorted_list so that it sorts keys according to Node.f. Strictly speaking the sorted dict above has an O(N) overhead for insertion and removal and O(NlogN) for creation. However these particular big-O's are handled quite efficiently by the sort(), list.insert() and list.remove() functions so it depends how big the list is. If that's not okay then you may want the sorteddict from the blist package on PyPI: http://stutzbachenterprises.com/blist/sorteddict.html That would give you O(logN) insertion/removal. The problem is that the sort key() function only gets to operate on the dict key not the value so you'd have to do something pretty funky to make it work. Perhaps: from blist import sorteddict def my_sorteddict(*args, **kwargs): # There's a good chance this doesn't work... def keyfunc(dictkey): return d[dictkey].f d = sorteddict(keyfunc, *args, **kwargs) return d Oscar