'Deleting elements from lists in a dictionary, Python
I have a dictionary with certain keys and lists of couples as elements. I want to perform the following operation: remove every element (couple) from all the lists for which its second element (or first, doesn't really matter) fulfills a certain condition. I tried with a very simple piece of code to do that, but I did not succeed and I in fact noticed a specific behavior: removing an element form a list let's the list's elements for loop skip the following element, for some reason (or at least this is what it looks like to me).
This is a very simple example:
# random dictionary
a = {'a': [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]],
'b': [[2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]]}
def f(d):
# keys in the dicitonary
for key in list(d):
# elements inthe list
for elem in d[key]:
# if the second element of the couple
# satisfies a certain criterion...
if elem[1] >= 2:
# remove that element (first occurrence) from the list
d[key].remove(elem)
return d
b = f(a)
print(b)
This is the output I get:
{'a': [[1, 1], [1, 3], [1, 5], [1, 7]], 'b': [[2, 1], [2, 3], [2, 5], [2, 7]]}
This is what I would like to have:
{'a': [[1, 1]], 'b': [[2, 1]]}
How do I perform the above described operation correctly?
Edit: I know there are some workarounds. My question is now about the skipping thing occurring in the for loop: why does it happen? Why does the code not work as I think it should?
Solution 1:[1]
You could iterate over the values (which are lists) and in a nested loop iterate over those lists again and if a certain value doesn't satisfy your condition, ignore it.
# random dictionary
a = {'a': [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]],
'b': [[2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]]}
def f(d):
# iterate over the keys
for key in d.keys():
value_list = d[key]
# create a temporary list
temp_list = []
for elem in value_list:
# if some element doesn't match the criteria, skip it
if elem[1] >= 2:
continue
# if the condition is satisfied, add it to the temporary list
temp_list.append(elem)
# replace the key's value with the modified list
d[key] = temp_list
return d
b = f(a)
print(b)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Vaibhav |
