Python Forum
Drop Keys From Dictionary - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Drop Keys From Dictionary (/thread-27231.html)



Drop Keys From Dictionary - donnertrud - May-30-2020

Hi guys,

I got a dictionary with values ranging from 0.25 to -0.25. I am looking for a way, to automatically drop all keys that are either

0 < value < 0.1

or

0 > value > -0.1


so basically all keys' values between 0.1 and -0.1 should be dropped from the dict. Is there an easy way to do that?


RE: Drop Keys From Dictionary - Knight18 - May-30-2020

You could iterate over the dictionary, checking each key value and if your conditions are met append that value to a new dictionary.

I don't think you can just drop key values from an existing dictionary.


RE: Drop Keys From Dictionary - donnertrud - May-30-2020

That would work aswell! Can you recall a code to do that ?


RE: Drop Keys From Dictionary - DreamingInsanity - May-30-2020

There's probably many ways of doing this, but personally I would use the filter() method:
ages = {"0.25": "a", "0.1":"b", "-0.03": "c", "-0.25": "d"}

def myFunc(x):
	if (not -0.1 <= float(x) <= 0.1):
		return x

ages = { k:ages[str(k)] for k in filter(myFunc, ages) }
Ages would then become: {'0.25': 'a', '-0.25': 'd'}
This could be compressed into 1 line if you wanted:
ages = { k:ages[str(k)] for k in filter(lambda x: not -0.1 <= float(x) <= 0.1, ages) }
EDIT: I read your post wrong. I didn't realise the floats were the the values and not the keys. Instead you can do this:
ages = {"1": "0.25", "2": "0.1", "3": "-0.03", "4": "-0.25"}
 
ages = { k:ages[str(k)] for k in filter(lambda x: not -0.1 <= float(ages[x]) <= 0.1, ages) }
print(ages)
which gets you:
Output:
{'1': '0.25', '4': '-0.25'}



RE: Drop Keys From Dictionary - WiPi - May-30-2020

Here's another straightforward method

dictOfVals = {1: 0.2, 2: -0.1, 3: 2, 4: 0.1, 5: 0.05}

newDict=dict()
# Iterate over all the dict values
for value in dictOfVals.values():
   if value > 0.1 or value < -0.1:
     print(value)



RE: Drop Keys From Dictionary - donnertrud - May-30-2020

(May-30-2020, 09:55 AM)WiPi Wrote: Here's another straightforward method

dictOfVals = {1: 0.2, 2: -0.1, 3: 2, 4: 0.1, 5: 0.05}

newDict=dict()
# Iterate over all the dict values
for value in dictOfVals.values():
   if value > 0.1 or value < -0.1:
     print(value)

How would I also get the corresponding key for each value?


RE: Drop Keys From Dictionary - Yoriz - May-30-2020

A dictionary has a pop method:

https://docs.python.org/3/library/stdtypes.html?highlight=dict%20pop#dict.pop Wrote:pop(key[, default])

If key is in the dictionary, remove it and return its value, else return default. If default is not given and key is not in the dictionary, a KeyError is raised.



RE: Drop Keys From Dictionary - donnertrud - May-30-2020

Thanks, with your help I made it work!

Now, is there a convenient way to select these keys in a data frame ? E.g. if the dict gave me the keys : "a" , "b" and "e", I want to select them from the the data frame where they are initially coming from :
df = df.columns["a", "b", "e"]
I could do it manually, however I got too many returned keys and I am asking out of curiosity.


RE: Drop Keys From Dictionary - DeaD_EyE - May-30-2020

Try following with pandas:
df = pd.DataFrame(columns=list("abcdefgh"))
df[["a", "b", "c"]]
In the previous question you asked how to get also the keys.
If you want to get also the keys, why not return two dicts?
One dict could hold all ok_values and the other can contain the not_ok_values.

def classify(mapping):
    """
    Return two dicts from mapping.
    The first dict contains the `ok values`
    and the second dict contains the `not ok values`
    """
    ok_mapping = {}
    nok_mapping = {}
    for key, value in mapping.items():
        if 0 < value < 0.1:
            ok_mapping[key] = value
        else:
            nok_mapping[key] = value
    return ok_mapping, nok_mapping


dictOfVals = {1: 0.2, 2: -0.1, 3: 2, 4: 0.1, 5: 0.05}
print(classify(dictOfVals))
Output:
({5: 0.05}, {1: 0.2, 2: -0.1, 3: 2, 4: 0.1})