Якщо значення 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комендації