Aniket Sulke
Aniket Sulke

Reputation: 33

How to delete a value from the key in python dictonary where values are stored in list

I want to delete a specific element from the values of a single key.

adj_city = {

'WA': ['NT','SA'],
'NT': ['WA','SA','Q'],
'SA': ['WA','NT','NSW','V'],
'Q' : ['NT', 'NSW'],
'NSW': ['Q','SA','V'],
'V': ['SA','NSW']
}

for i in adj_city['WA'] :
    if(i=='NT'):
        del(i)

I am expecting the output as 'WA': ['SA'] but after running the above code I am not getting the output

Upvotes: 1

Views: 66

Answers (4)

Jan
Jan

Reputation: 43169

You could go for

adj_city = {
    'WA': ['NT','SA'],
    'NT': ['WA','SA','Q'],
    'SA': ['WA','NT','NSW','V'],
    'Q' : ['NT', 'NSW'],
    'NSW': ['Q','SA','V'],
    'V': ['SA','NSW']
}

# keys where the values need to be removed
dict_keys = ['WA']

# values to be removed
unwanted_values = ['NT']

for key in dict_keys:
    try:
        adj_city[key] = [item 
                         for item in adj_city[key] 
                         if not item in unwanted_values]
    except KeyError:
        pass

print(adj_city)

Which yields

{
    'WA': ['SA'], 
    'NT': ['WA', 'SA', 'Q'], 
    'SA': ['WA', 'NT', 'NSW', 'V'], 
    'Q': ['NT', 'NSW'], 
    'NSW': ['Q', 'SA', 'V'], 
    'V': ['SA', 'NSW']
}

Upvotes: 0

Dipen Dadhaniya
Dipen Dadhaniya

Reputation: 4630

To know why your code doesn't work, try to understand the below code:

arr = [1, 2, 3]

for val in arr:
    del val

    try:
        val
    except NameError as e:
        print(e)

    print(arr)

Output:

name 'val' is not defined
[1, 2, 3]
name 'val' is not defined
[1, 2, 3]
name 'val' is not defined
[1, 2, 3]

Observation:

  • Variable val is deleted (i.e. it is not available anymore) and but arr is untouched.

Simply use a list comprehension:

adj_city = {
    'WA': ['NT','SA'],
    'NT': ['WA','SA','Q'],
    'SA': ['WA','NT','NSW','V'],
    'Q' : ['NT', 'NSW'],
    'NSW': ['Q','SA','V'],
    'V': ['SA','NSW']
}

adj_city["WA"] = [city for city in adj_city["WA"] if city != 'NT'] 

assert adj_city == {
    'WA': ['SA'],
    'NT': ['WA','SA','Q'],
    'SA': ['WA','NT','NSW','V'],
    'Q' : ['NT', 'NSW'],
    'NSW': ['Q','SA','V'],
    'V': ['SA','NSW']
}

Upvotes: 1

Dani Mesejo
Dani Mesejo

Reputation: 61900

If you want to remove the NT value use remove, never iterate and delete at the same time:

adj_city = {

'WA': ['NT','SA'],
'NT': ['WA','SA','Q'],
'SA': ['WA','NT','NSW','V'],
'Q' : ['NT', 'NSW'],
'NSW': ['Q','SA','V'],
'V': ['SA','NSW']
}

adj_city['WA'].remove('NT')

print(adj_city['WA'])

Output

['SA']

Upvotes: 2

Rakesh
Rakesh

Reputation: 82755

Using a list comprehension

Ex:

adj_city = {
    'WA': ['NT','SA'],
    'NT': ['WA','SA','Q'],
    'SA': ['WA','NT','NSW','V'],
    'Q' : ['NT', 'NSW'],
    'NSW': ['Q','SA','V'],
    'V': ['SA','NSW']
}

adj_city["WA"] = [i for i in adj_city["WA"] if i != 'NT'] 
print(adj_city)

Output:

{'NSW': ['Q', 'SA', 'V'],
 'NT': ['WA', 'SA', 'Q'],
 'Q': ['NT', 'NSW'],
 'SA': ['WA', 'NT', 'NSW', 'V'],
 'V': ['SA', 'NSW'],
 'WA': ['SA']}

Note: Not a good practice to delete an element while iterating the object.

Upvotes: 0

Related Questions