Python Forum

Full Version: Drop Keys From Dictionary
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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?
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.
That would work aswell! Can you recall a code to do that ?
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'}
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)
(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?
A dictionary has a pop method:

https://docs.python.org/3/library/stdtyp...p#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.
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.
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})