python setdefault(key,set())).update(... возвращает None
У меня проблема с setdefault и профсоюзами, которые не работают так, как я ожидаю. Мой код выглядит так:
#!/usr/bin/python3.3
kanjidic = {
'恕': {'radical':{'multi_radical': {'口心女'}}},
'靛': {'radical':{'multi_radical': {'亠宀月疋二青土'}}},
}
k_rad = {}
for k,v in kanjidic.items():
if 'radical' in v and 'multi_radical' in v['radical']:
print (k, set(v['radical']['multi_radical']))
k_rad[k] = k_rad.setdefault(k, set()).update(
set(v['radical']['multi_radical']))
print('>>', k_rad[k])
Вывод на печать выглядит так:
恕 {'口 心 女'} >> Нет 靛 {'亠宀月疋二青土'} >> Нет
Если я подставлю две строки ниже для установки k_rad:
k_rad[k] = k_rad.setdefault(k, set())
k_rad[k].update(set(v['radical']['multi_radical']))
Мой вывод выглядит так:
靛 {'亠宀月疋二青土'} >> {'亠 宀 月 疋 二 青 土'} 恕 {'口 心 女'} >> {'口 心 女'}
Если я понимаю setdefault, (что, очевидно, я не понимаю), вывод должен быть одинаковым, верно? Что мне не хватает? Почему я dict.setupdate(key,set()).update(set(...))
возвращение Нет?
Как указано ниже, проблема в том, что обновление возвращает None. Я действительно не понимал, как update и setdefault работают вместе. Так как setdefault устанавливает значение dict по умолчанию, если мы создаем новый элемент dict и возвращаем хэш, а обновление обновляет элемент, назначение которого мне не нужно. Все, что мне действительно нужно было:
for k,v in kanjidic.items():
if 'radical' in v and 'multi_radical' in v['radical']:
k_rad.setdefault(k, set()).update(v['radical']['multi_radical'])
Спасибо за помощь!
1 ответ
dict.setdefault
возвращает набор в вашем случае. А также set.update
является операцией на месте, что означает, что она изменяет исходный набор и возвращает None. Поэтому, если вы присваиваете результат переменной, вы просто присваиваете ей None.