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.
mydict[k] = '' -- your example updates k index to an immutable object, ''. So after this, k would point to an entirely different object than v. Would this mutate the k index in some way that might cause problems with .iteritems()?dict.iteritems..items to loop if you're adding/removing keys is prudent. I don't know the implementation details of dict_items objects, but it seems that you might still have issues iterating over them in python3.x if you're adding/deleting keys. In that case, it's probably safest to iterate over a list of the keys: for k in list(mydict): v = mydict[k]; ...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.
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())
.items() it doesn't matter (for python2) if you modify mydict as the list that .items() returns will not change even if you add/remove keys of mydictif v is not None instead of if v (re-read the question). Overall summary: -1''. I would suggest replacing if v by if v is None, this is also more PEP 8 compliant : python.org/dev/peps/pep-0008/#programming-recommendations