Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove values from dictionary

Tags:

python-3.x

I have a large dictionary and I am trying to remove values from keys if they start with certain values. Below is a small example of the dictionary.

a_data = {'78567908': {'26.01.17', '02.03.24', '26.01.12', '04.03.03', '01.01.13', '02.03.01', '01.01.10', '26.01.21'}, '85789070': {'26.01.02', '09.01.04', '02.05.04', '02.03.17', '02.05.01'}, '87140110': {'03.15.25', '03.15.24', '03.15.19'}, '87142218': {'26.17.13', '02.11.01', '02.03.22'}, '87006826': {'28.01.03'}}

After I read in the dictionary, I want to remove values from all keys that start with '26.' or '02.' It is possible that would leave a key with no values (an empty set).

I do have code that works:

exclude = ('26.', '02.')
f_a_data = {}
for k, v in a_data.items():
    f_a_data.setdefault(k,[])
    for code in v:
        print (k, code, not code.startswith(exclude))
        if not code.startswith(exclude):
            f_a_data[k].append(code)


print('Filtered dict:')
print(f_a_data)  

This returns a filtered dict:

Filtered dict:
{'78567908': ['04.03.03', '01.01.13', '01.01.10'], '85789070': ['09.01.04'], '87140110': ['03.15.25', '03.15.24', '03.15.19'], '87142218': [], '87006826': ['28.01.03']}

Question 1: Is this the best way to filter a dictionary?

Question 2: How could i modify the above snippet to return values in a set like the original dict?

like image 272
Britt Avatar asked Dec 18 '18 14:12

Britt


People also ask

Can we delete values in dictionary Python?

The del keyword can be used to in-place delete the key that is present in the dictionary in Python.

Can we delete elements from dictionary?

You can use both dict. pop() method and a more generic del statement to remove items from a dictionary. They both mutate the original dictionary, so you need to make a copy (see details below). Unless you use pop() to get the value of a key being removed you may provide anything, not necessary None .


1 Answers

Your code is quite all right in complexity terms but can be "pythonized" a little and still remain readable.

My proposal: you can rebuild a dictionary using nested comprehensions and all to test if you should include the values:

a_data = {'78567908': {'26.01.17', '02.03.24', '26.01.12', '04.03.03', '01.01.13', '02.03.01', '01.01.10', '26.01.21'}, '85789070': {'26.01.02', '09.01.04', '02.05.04', '02.03.17', '02.05.01'}, '87140110': {'03.15.25', '03.15.24', '03.15.19'}, '87142218': {'26.17.13', '02.11.01', '02.03.22'}, '87006826': {'28.01.03'}}
exclude = ('26.', '02.')

new_data = {k:{x for x in v if all(s not in x for s in exclude)} for k,v in a_data.items()}

result:

>>> new_data
{'78567908': {'01.01.10', '01.01.13', '04.03.03'},
 '85789070': {'09.01.04'},
 '87006826': {'28.01.03'},
 '87140110': {'03.15.19', '03.15.25', '03.15.24'},
 '87142218': set()}

(here using a dictionary comprehension embedding a set comprehension (since you need a set) using a generator comprehension in all)

like image 115
Jean-François Fabre Avatar answered Nov 15 '22 08:11

Jean-François Fabre