By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,533 Members | 1,334 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,533 IT Pros & Developers. It's quick & easy.

Dictionary question

P: n/a
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)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #1
Share this Question
Share on Google+
7 Replies


P: n/a
Brian Elmegaard <br***@rkspeed-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)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
--
Brian (remove the sport for mail)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #2

P: n/a
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 <br***@rkspeed-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)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk

--
Brian (remove the sport for mail)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #3

P: n/a
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(keytotal), valtotal)
comes close to working - it would if you were doing max.
--
- Justin

Jul 18 '06 #4

P: n/a
On 18/07/2006 9:51 PM, Brian Elmegaard wrote:
Brian Elmegaard <br***@rkspeed-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
http://www.python.org/dev/peps/pep-0008
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
Jul 18 '06 #5

P: n/a
John Machin <sj******@lexicon.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)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #6

P: n/a
"Justin Azoff" <ju**********@gmail.comwrites:
last[keytotal] = min(last.get(keytotal), valtotal)
comes close to working - it would if you were doing max.
Thanks, I think this would help.

--
Brian (remove the sport for mail)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #7

P: n/a
"Nick Vatamaniuc" <va******@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)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
Rugbyklubben Speed Scandinavian Open 7s Rugby http://www.rkspeed.dk
Jul 18 '06 #8

This discussion thread is closed

Replies have been disabled for this discussion.