Dictionary question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Brian Elmegaard

    #1

    Dictionary question

    Hi

    I have written the following which works, but I would like to write it
    less clumsy. I have a dictionary in which I loop through the keys for
    a dynamic programming algorithm. If a key is present I test if its
    value is better than the current, if it is not present I just create
    it. Would it be possible to write it more compact?

    ############### 3
    c=1
    s=8
    x=2

    l=list()
    l.append(dict() )
    l[0][5]=0

    l.append(dict() )

    for a, e in l[-2].iteritems():
    if a+c<s: ##### Can this improved?
    if a+c in l[-1]: #####
    if l[-1][a+c]<x+e: #####
    l[-1][a+c]=x+e #####
    else: #####
    l[-1][a+c]=x+e #####
    print l
    ############### ######

    tia,
    --
    Brian (remove the sport for mail)

    Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
  • Brian Elmegaard

    #2
    Re: Dictionary question

    Brian Elmegaard <brian@rkspee d-rugby.dkwrites:

    At least it was clumsy to post a wrong example.
    This shows what = find clumsy.

    c=1
    x=2

    l=list()
    l.append(dict() )
    l[0][5]=0

    l.append(dict() )

    for a, e in l[-2].iteritems():
    ######### Can this be written better?
    if a+c in l[-1]:
    if l[-1][a+c]<x+e:
    l[-1][a+c]=x+e
    else:
    l[-1][a+c]=x+e
    #########

    print l

    Hi
    >
    I have written the following which works, but I would like to write it
    less clumsy. I have a dictionary in which I loop through the keys for
    a dynamic programming algorithm. If a key is present I test if its
    value is better than the current, if it is not present I just create
    it. Would it be possible to write it more compact?
    >
    ############### 3
    c=1
    s=8
    x=2
    >
    l=list()
    l.append(dict() )
    l[0][5]=0
    >
    l.append(dict() )
    >
    for a, e in l[-2].iteritems():
    if a+c<s: ##### Can this improved?
    if a+c in l[-1]: #####
    if l[-1][a+c]<x+e: #####
    l[-1][a+c]=x+e #####
    else: #####
    l[-1][a+c]=x+e #####
    print l
    ############### ######
    >
    tia,
    --
    Brian (remove the sport for mail)

    Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
    --
    Brian (remove the sport for mail)

    Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

    Comment

    • Nick Vatamaniuc

      #3
      Re: Dictionary question

      Brian,
      You can try the setdefault method of the dictionary.
      For a dictionary D the setdefault work like this:
      D.setdefault(k, defvalue). If k not in D then D[k] is set to defvalue
      and defvalue is returned.
      For example:
      In [1]: d={}
      In [2]: d.setdefault(1, 5)
      Out[2]:5
      In [3]: d
      Out[3]:{1: 5}
      In your case you could do something like:

      if l[-1].setdefault(a+c , x+e)<x+e:
      l[-1][a+c]=x+e

      If a+c not in l[-1] then it the if ... line will set it to x+e and x+e
      will be returned, obviously the if ... will fail and the execution will
      go on after the if block. If a+c is in l[-1] then if will compare
      l[-1][a+c] to x+e.

      Also for clarity you might actually want to assign some variables to
      a+c and x+e since you repeat them so often. That actually might speed
      up your code a little too, but don't do it just for a minor speedup do
      it for clarity and simplicity most of all!

      Good luck,
      Nick Vatamaniuc


      Brian Elmegaard wrote:
      Brian Elmegaard <brian@rkspee d-rugby.dkwrites:
      >
      At least it was clumsy to post a wrong example.
      This shows what = find clumsy.
      >
      c=1
      x=2
      >
      l=list()
      l.append(dict() )
      l[0][5]=0
      >
      l.append(dict() )
      >
      for a, e in l[-2].iteritems():
      ######### Can this be written better?
      if a+c in l[-1]:
      if l[-1][a+c]<x+e:
      l[-1][a+c]=x+e
      else:
      l[-1][a+c]=x+e
      #########
      >
      print l
      >
      >
      Hi

      I have written the following which works, but I would like to write it
      less clumsy. I have a dictionary in which I loop through the keys for
      a dynamic programming algorithm. If a key is present I test if its
      value is better than the current, if it is not present I just create
      it. Would it be possible to write it more compact?

      ############### 3
      c=1
      s=8
      x=2

      l=list()
      l.append(dict() )
      l[0][5]=0

      l.append(dict() )

      for a, e in l[-2].iteritems():
      if a+c<s: ##### Can this improved?
      if a+c in l[-1]: #####
      if l[-1][a+c]<x+e: #####
      l[-1][a+c]=x+e #####
      else: #####
      l[-1][a+c]=x+e #####
      print l
      ############### ######

      tia,
      --
      Brian (remove the sport for mail)

      Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
      >
      --
      Brian (remove the sport for mail)

      Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

      Comment

      • Justin  Azoff

        #4
        Re: Dictionary question

        Brian Elmegaard wrote:
        for a, e in l[-2].iteritems():
        ######### Can this be written better?
        if a+c in l[-1]:
        if l[-1][a+c]<x+e:
        l[-1][a+c]=x+e
        else:
        l[-1][a+c]=x+e
        #########
        I'd start with something like

        for a, e in l[-2].iteritems():
        keytotal = a+c
        valtotal = x+e
        last = l[-1]
        if keytotal in last:
        if last[keytotal] < valtotal:
        last[keytotal] = valtotal
        else:
        last[keytotal] = valtotal

        Could probably simplify that even more by using min(), but I don't know
        what kind of data you are expecting....
        last[keytotal] = min(last.get(ke ytotal), valtotal)
        comes close to working - it would if you were doing max.


        --
        - Justin

        Comment

        • John Machin

          #5
          Re: Dictionary question

          On 18/07/2006 9:51 PM, Brian Elmegaard wrote:
          Brian Elmegaard <brian@rkspee d-rugby.dkwrites:
          >
          At least it was clumsy to post a wrong example.
          This shows what = find clumsy.
          >
          c=1
          x=2
          >
          l=list()
          l.append(dict() )
          l[0][5]=0
          >
          l.append(dict() )
          >
          for a, e in l[-2].iteritems():
          ######### Can this be written better?
          Definitely.
          1. Use meaningful names. Especially don't use 'L'.lower() as it's too
          easily confused with the digit '1'.
          2. Put spaces around operators -- in general, RTFStyleGuide
          This document gives coding conventions for the Python code comprising the standard library in the main Python distribution. Please see the companion informational PEP describing style guidelines for the C code in the C implementation of Python.

          3. When you find yourself typing the same expression 4 times, it's time
          to give it a name of its own (or to throw away a usage or two).

          if a+c in l[-1]:
          if l[-1][a+c]<x+e:
          l[-1][a+c]=x+e
          else:
          l[-1][a+c]=x+e
          Here's a start. Only you know what *really* meaningful names you should
          be using.

          mykey = a + c
          newvalue = x + e
          lastdict = dictlist[-1]
          if mykey not in lastdict or lastdict[mykey] < newvalue:
          lastdict[mykey] = newvalue

          4. Add some comments about what you are trying to achieve. What is the
          point of keeping the two dicts in a list??? Can't you give them names,
          like rawdatadict and maxdict?

          HTH,
          John

          Comment

          • Brian Elmegaard

            #6
            Re: Dictionary question

            John Machin <sjmachin@lexic on.netwrites:
            2. Put spaces around operators -- in general, RTFStyleGuide
            http://www.python.org/dev/peps/pep-0008
            I din't know it. Thanks.
            Only you know what *really* meaningful names you should be using.
            I have better names in my running code.
            mykey = a + c
            newvalue = x + e
            lastdict = dictlist[-1]
            if mykey not in lastdict or lastdict[mykey] < newvalue:
            lastdict[mykey] = newvalue
            Better, thanks.
            4. Add some comments about what you are trying to achieve. What is the
            point of keeping the two dicts in a list??? Can't you give them
            names, like rawdatadict and maxdict?
            It's a dynamic programming problem, so this will contain as many dicts
            as hours in the year.

            --
            Brian (remove the sport for mail)

            Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

            Comment

            • Brian Elmegaard

              #7
              Re: Dictionary question

              "Justin Azoff" <justin.azoff@g mail.comwrites:
              last[keytotal] = min(last.get(ke ytotal), valtotal)
              comes close to working - it would if you were doing max.
              Thanks, I think this would help.

              --
              Brian (remove the sport for mail)

              Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

              Comment

              • Brian Elmegaard

                #8
                Re: Dictionary question

                "Nick Vatamaniuc" <vatamane@gmail .comwrites:
                if l[-1].setdefault(a+c , x+e)<x+e:
                l[-1][a+c]=x+e
                Thanks for the answer. I will try it.

                --
                Brian (remove the sport for mail)

                Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

                Comment

                Working...