Dictionary question

B

Brian Elmegaard

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,
 
B

Brian Elmegaard

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,
 
N

Nick Vatamaniuc

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 said:
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,
 
J

Justin Azoff

Brian said:
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.
 
J

John Machin

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
 
B

Brian Elmegaard

John Machin said:
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.
 
B

Brian Elmegaard

Justin Azoff said:
last[keytotal] = min(last.get(keytotal), valtotal)
comes close to working - it would if you were doing max.

Thanks, I think this would help.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,681
Members
48,796
Latest member
Greg L.

Latest Threads

Top