Якщо значення None, я хотів би змінити його на "" (порожній рядок).
Я починаю так, але забуваю:
for k, v in mydict.items():
if v is None:
... right?
Відповіді:
for k, v in mydict.iteritems():
if v is None:
mydict[k] = ''
У більш загальному випадку, наприклад, якщо ви додавали або видаляли ключі, може бути небезпечно змінити структуру контейнера, в якому ви циклюєтесь - тому використання itemsциклу в незалежному списку копії може бути розумним - але призначаючи інше значення при заданому існуючому індекси не НЕ несеш ніякої проблеми, тому, в Python 2.Any, це краще використовувати iteritems.
Однак у Python3 код видає AttributeError: 'dict' object has no attribute 'iteritems'помилку. Використовуйте items()замість iteritems()тут.
Зверніться до цієї публікації.
mydict[k] = ''- ваш приклад оновлює kіндекс до незмінного об'єкта, - ''. Тож після цього kвказував би на зовсім інший об'єкт, ніж v. Чи не змінить це kіндекс певним чином, що може спричинити проблеми .iteritems()?
dict.iteritems.
.itemsдля циклу при додаванні / видаленні ключів, є розумною. Я не знаю деталей реалізації dict_itemsоб’єктів, але, схоже, у вас все ще можуть виникнути проблеми з ітерацією над ними в python3.x, якщо ви додаєте / видаляєте ключі. У такому випадку, мабуть, найбезпечніше переглядати список ключів: for k in list(mydict): v = mydict[k]; ...
Ви можете створити розуміння дикту лише з елементів, значення яких відсутні, а потім оновити назад до оригіналу:
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
Оновлення - зробив кілька тестів продуктивності
Що ж, після спробування диктовок від 100 до 10000 предметів, із різним відсотком значень None, ефективність рішення Алекса є в цілому приблизно вдвічі швидшою, ніж це рішення.
Розуміння зазвичай швидше, і це має ту перевагу, що не редагує mydictпід час ітерації:
mydict = dict((k, v if v else '') for k, v in mydict.items())
.items()це не має значення (для python2), якщо ви зміните mydictсписок, що .items()повертається, не зміниться, навіть якщо ви додасте / видалите ключі відmydict
if v is not Noneзамість if v(перечитати питання). Загальний підсумок: -1
''. Я б запропонував замінити if vна if v is None, це також більше відповідає PEP 8: python.org/dev/peps/pep-0008/#programming-reкомендації