del tuple-keys from nested dict; avoid runtime and type error
Clash Royale CLAN TAG#URR8PPP
del tuple-keys from nested dict; avoid runtime and type error
I have generated a large, nested dictionary from a pandas dataframe that was originally from an .xlsx sheet. Through the process, some of the empty cells from my excel sheet were imported as 'nan' and the values are stored in tuples, which serve as keys. The resulting dictionary looks something like this:
d_nans = 'feature1': ('1', '2'): ['item1':'value1', 'item2': 'value2'],
('nan', 'nan'): ['item3':'value3', 'item4': 'value4'],
'feature2': ('3', '10'): ['item5':'value5', 'item6': 'value6'],
('nan', 'nan'): ['item7':'value7', 'item8': 'value8'],
('23', '40'): ['item9':'value9', 'item10': 'value10'],
'feature3': ('21', '5000'): ['item51':'value51', 'item61': 'value61'],
('nan', 'nan'): ['item71':'value71', 'item81': 'value81'],
('560', '2400'): ['item19':'value19', 'item110': 'value110']
I need a way to edit the dict to remove all key:value pairs where the keys have the value ('nan', 'nan'). I tried this:
for key, value in d_nans.items():
seq_id = key
feature_type = value
for key, value in feature_type.items():
if type(key) == tuple:
if key[0] == 'nan':
del feature_type[key]
Runtime Error: 'dictionary changed size over iteration'
which I tried to solve using some code from How to solve dictionary changed size during iteration in Python
for key, value in d_nans.items():
seq_id = key
feature_type = value
for key, value in feature_type.items():
for sub_key in list(feature_type.keys()):
if sub_key[0] == 'nan':
del dict[sub_key]
but this gives me
TypeError: 'type' object does not support item deletion
Any suggestions would be appreciated!
2 Answers
2
You can use dict.pop
to remove specific keys if they exist. Specify a default value to avoid KeyError
if the key does not exist. Since you have a nested dictionary, you can use a for
loop.
dict.pop
KeyError
for
for v in d_nans.values():
v.pop(('nan', 'nan'), None)
It's not normally a good idea to modify a dictionary as you iterate over it, but you get away with it here because you aren't deleting / adding keys in the parent d_nans
dictionary.
d_nans
Now let's look at your two attempts:
Iterating views while adding or deleting entries in the dictionary may
raise a RuntimeError
or fail to iterate over all entries.
RuntimeError
dict
del dict[key]
Instead of looping through the inner dictionaries (feature_type
) to see if ('nan', 'nan')
exists, you can just check if feature_type
contains ('nan', 'nan')'
. This way, you can avoid both errors. Try this code:
feature_type
('nan', 'nan')
feature_type
('nan', 'nan')'
for _, feature_type in d_nans.items():
if ('nan', 'nan') in feature_type:
del feature_type[('nan', 'nan')]
If you input your example into this loop, d_nans
will become the following:
d_nans
'feature1': ('1', '2'): ['item1': 'value1', 'item2': 'value2'],
'feature2': ('3', '10'): ['item5': 'value5', 'item6': 'value6'], ('23', '40'): ['item9': 'value9', 'item10': 'value10'],
'feature3': ('21', '5000'): ['item51': 'value51', 'item61': 'value61'], ('560', '2400'): ['item19': 'value19', 'item110': 'value110']
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.