Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #64405

Re: which data structure to use?

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 <oscar.j.benjamin@gmail.com>
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 <oscar.j.benjamin@gmail.com>
To python-list@python.org
Subject Re: which data structure to use?
References <a0d3734d-5275-4b28-9a3f-6957474674d7@googlegroups.com>
MIME-Version 1.0
Content-Type text/plain; charset=iso-8859-1
Content-Disposition inline
Content-Transfer-Encoding 8bit
In-Reply-To <a0d3734d-5275-4b28-9a3f-6957474674d7@googlegroups.com>
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 <python-list.python.org>
List-Unsubscribe <https://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive <http://mail.python.org/pipermail/python-list/>
List-Post <mailto:python-list@python.org>
List-Help <mailto:python-list-request@python.org?subject=help>
List-Subscribe <https://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe>
Newsgroups comp.lang.python
Message-ID <mailman.5780.1390305003.18130.python-list@python.org> (permalink)
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

Show key headers only | View raw


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

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-21 03:17 -0800
  Re: which data structure to use? Chris Angelico <rosuav@gmail.com> - 2014-01-21 22:27 +1100
  Re: which data structure to use? Ben Finney <ben+python@benfinney.id.au> - 2014-01-21 22:34 +1100
  Re: which data structure to use? Oscar Benjamin <oscar.j.benjamin@gmail.com> - 2014-01-21 11:49 +0000
    Re: which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-21 05:38 -0800
      Re: which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-21 05:43 -0800
        Re: which data structure to use? Mark Lawrence <breamoreboy@yahoo.co.uk> - 2014-01-21 18:03 +0000
      Re: which data structure to use? Oscar Benjamin <oscar.j.benjamin@gmail.com> - 2014-01-21 13:59 +0000
      Re: which data structure to use? Peter Otten <__peter__@web.de> - 2014-01-21 15:09 +0100
      Re: which data structure to use? Peter Otten <__peter__@web.de> - 2014-01-21 15:19 +0100
        Re: which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-21 07:33 -0800
          Re: which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-21 07:37 -0800
            Re: which data structure to use? Peter Otten <__peter__@web.de> - 2014-01-21 19:39 +0100
              Re: which data structure to use? Robert Voigtländer <r.voigtlaender@gmail.com> - 2014-01-22 01:38 -0800

csiph-web