Вы можете просто сделать
for word in (jsondata['value']['segments'][i]['transcriptionData']['content']).split():
word = fdict.get(word, word)
Используя get
, вы увидите, является ли word
действительным ключом, если это так, вернуть соответствующее значение, в противном случае, вернуть второй аргумент какпо умолчанию, в этом случае word
.Вам не нужно перебирать fdict
, так как этот вид в первую очередь опровергает цель словаря.Тестирование на членство - это постоянный и быстрый процесс.
Если вы хотите, чтобы это было отражено в самом словаре, вам необходимо заново присвоить значение этому ключу:
# changing this to be more pythonic and readable
for segment in jsondata['value']['segments']:
# assigning this to be a different variable for readability
words = segment['transcriptionData']['content'].split()
# join will make this a string again so we can re-assign it
# to the key
words = ' '.join(fdict.get(word, word) for word in words)
# Now this will be reflected in your json
segment['transcriptionData']['content'] = words
Кроме того, в вашем выражении if
, word==v
вернет False
, так как ==
- это тест на равенство, а не присвоение значения, и это должно было быть word = v
Чтобы обратиться к обновлению в вопросе, вы никогда не пишете обновленное words
в любом месте.Данные в вашей программе - , а не файл, поэтому любые изменения, внесенные в данные, не будут отражены в файле, пока вы не запишите данные обратно в файл.
# after you update words
# Note, this is a different file path, as w will truncate (wipe out) the
# file if it exists, so use a different file path until you are sure your
# logic is sound
with open('somefile.json', 'w') as fh:
json.dump(jsondata)