In Python, how do I loop through the dictionary and change the value if it equals something?
Question:
If the value is None, I’d like to change it to “” (empty string).
I start off like this, but I forget:
for k, v in mydict.items():
if v is None:
... right?
Answers:
for k, v in mydict.iteritems():
if v is None:
mydict[k] = ''
In a more general case, e.g. if you were adding or removing keys, it might not be safe to change the structure of the container you’re looping on — so using items
to loop on an independent list copy thereof might be prudent — but assigning a different value at a given existing index does not incur any problem, so, in Python 2.any, it’s better to use iteritems
.
In Python3 however the code gives AttributeError: 'dict' object has no attribute 'iteritems'
error. Use items()
instead of iteritems()
here.
Refer to this post.
Comprehensions are usually faster, and this has the advantage of not editing mydict
during the iteration:
mydict = dict((k, v if v else '') for k, v in mydict.items())
You could create a dict comprehension of just the elements whose values are None, and then update back into the original:
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
Update – did some performance tests
Well, after trying dicts of from 100 to 10,000 items, with varying percentage of None values, the performance of Alex’s solution is across-the-board about twice as fast as this solution.
If the value is None, I’d like to change it to “” (empty string).
I start off like this, but I forget:
for k, v in mydict.items():
if v is None:
... right?
for k, v in mydict.iteritems():
if v is None:
mydict[k] = ''
In a more general case, e.g. if you were adding or removing keys, it might not be safe to change the structure of the container you’re looping on — so using items
to loop on an independent list copy thereof might be prudent — but assigning a different value at a given existing index does not incur any problem, so, in Python 2.any, it’s better to use iteritems
.
In Python3 however the code gives AttributeError: 'dict' object has no attribute 'iteritems'
error. Use items()
instead of iteritems()
here.
Refer to this post.
Comprehensions are usually faster, and this has the advantage of not editing mydict
during the iteration:
mydict = dict((k, v if v else '') for k, v in mydict.items())
You could create a dict comprehension of just the elements whose values are None, and then update back into the original:
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
Update – did some performance tests
Well, after trying dicts of from 100 to 10,000 items, with varying percentage of None values, the performance of Alex’s solution is across-the-board about twice as fast as this solution.