Velocity Reviews > Function to prune dictionary keys not working

# Function to prune dictionary keys not working

Girish Sahani
Guest
Posts: n/a

 06-28-2006
hi ppl,
Here is a simple function to remove those keys of a dictionary whose
values are less than some specified value. But it isnt working. Please
help.

def prune(d,cp):
l = []
for rule,value in d.iteritems():
#print value
if value >= cp:
l.append(rule)
return l

>>> d = {'be=>c': '1.00', 'c=>da': '0.50', 'ea=>b': '0.33', 'be=>d':

'0.50', 'c=>ba': '0.33', 'bd=>a': '1.00', 'a=>cb': '0.33', 'ea=>c':
'0.67', 'a=>cd': '0.50', 'e=>ac': '0.40', 'e=>ab': '0.20', 'c=>bd':
'0.33', 'e=>cb': '0.40', 'ed=>b': '0.25', 'ed=>c': '0.50'}
>>> cp = 0.5
>>> if prune(d,cp) == d.keys():

print "code not working ("

code not working (

John Machin
Guest
Posts: n/a

 06-28-2006
On 28/06/2006 12:15 PM, Girish Sahani wrote:
> hi ppl,
> Here is a simple function to remove those keys of a dictionary whose
> values are less than some specified value. But it isnt working. Please
> help.
>
> def prune(d,cp):
> l = []
> for rule,value in d.iteritems():
> #print value
> if value >= cp:
> l.append(rule)
> return l
>
>
>>>> d = {'be=>c': '1.00', 'c=>da': '0.50', 'ea=>b': '0.33', 'be=>d':

> '0.50', 'c=>ba': '0.33', 'bd=>a': '1.00', 'a=>cb': '0.33', 'ea=>c':
> '0.67', 'a=>cd': '0.50', 'e=>ac': '0.40', 'e=>ab': '0.20', 'c=>bd':
> '0.33', 'e=>cb': '0.40', 'ed=>b': '0.25', 'ed=>c': '0.50'}
>>>> cp = 0.5
>>>> if prune(d,cp) == d.keys():

> print "code not working ("
>
> code not working (
>

|>> '1.00' >= 0.5
True
|>> '0.33' >= 0.5
True

Python (correctly) does very little (guesswork-based) implicit type
conversion.

It looks like the values in your dictionary should stored as floats, not
as strings.

HTH,
John

Serge Orlov
Guest
Posts: n/a

 06-28-2006
On 6/27/06, John Machin <(E-Mail Removed)> wrote:
> |>> '1.00' >= 0.5
> True
> |>> '0.33' >= 0.5
> True
>
> Python (correctly) does very little (guesswork-based) implicit type
> conversion.

At the same time, Python (incorrectly compares incomparable objects.

Bruno Desthuilliers
Guest
Posts: n/a

 06-29-2006
Girish Sahani a écrit :
> hi ppl,
> Here is a simple function to remove those keys of a dictionary whose
> values are less than some specified value.
>
> But it isnt working.

"is not working" is the worst possible description of a problem.

> def prune(d,cp):
> l = []
> for rule,value in d.iteritems():
> #print value
> if value >= cp:
> l.append(rule)
> return l

This doesn't remove anything from the dict - it returns a list of keys
for which values are >= cp value. FWIW, a simple expression is enough to
do this:
[k for k, v in d.items() if v >= cp]

The algorithm for what you described would be:
def prune(dic, cmp):
for k, v in dic.items():
if v < cmp:
del dic[k]

>>>>d = {'be=>c': '1.00', 'c=>da': '0.50', 'ea=>b': '0.33', 'be=>d':

>
> '0.50', 'c=>ba': '0.33', 'bd=>a': '1.00', 'a=>cb': '0.33', 'ea=>c':
> '0.67', 'a=>cd': '0.50', 'e=>ac': '0.40', 'e=>ab': '0.20', 'c=>bd':
> '0.33', 'e=>cb': '0.40', 'ed=>b': '0.25', 'ed=>c': '0.50'}
>
>>>>cp = 0.5

You are comparing floats with strings...