У меня есть четыре списка строк специальных символов, например '™'. Я храню их в словаре как значение для ключей с 1 по 4.
Я пытаюсь просмотреть все элементы в каждом из списков словаря, а затем обновить каждое значение до его эквивалента в кодировке utf-8. Вот что у меня есть до сих пор:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
for val in uni_dic[key]:
uni_dic.update({key,val.encode('utf-8')})
Это возвращает «ValueError: элемент последовательности обновления словаря № 0 имеет длину 1; 2 требуется'
{value , value}
есть set
. {key : value}
это dict
вы получаете синтаксическую ошибку, потому что вы вызываете update
с другим словарем. uni_dic.update(key: value.encode("utf-8")
Однако я не уверен, чего именно вы пытаетесь достичь, потому что существующий код просто изменяет существующий словарь. Поиск или перевод не выполняются.
Убери последние три строчки и напиши:
for key, values in uni_dic.items():
uni_dic[key] = [string.encode('utf-8') for string in values]
или в одну строку:
uni_dic = {key: [string.encode('utf-8') for string in uni_dic[key]] for key in uni_dic}
uni_dic}
Вы имели в виду строку в значениях для первого предложения?
да, я отредактировал.
В этом случае вы можете создать другой список, как показано ниже:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
Если вы хотите сделать это на месте:
for key in uni_dic:
for idx, val in enumerate(uni_dic[key]):
uni_dic[key][idx] = val.encode('utf-8')
Однострочное решение вашего вопроса:
uni_dic = {key:[val.encode('utf-8') for val in charList] for key, charList in uni_dic.items()}
Чтобы получить тот же результат с минимальной модификацией кода в вашем вопросе, вы можете сделать это:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
charList = uni_dic[key]
for i, val in enumerate(charList):
charList[i] = val.encode('utf-8')
[print(charList) for charList in uni_dic.values()]
Выход:
[b'\xe2\x82\xac', b'\xe2\x80\x9a', b'\xc6\x92', b'\xe2\x80\x9e', b'\xe2\x80\xa6', b'\xe2\x80\xa0', b'\xcb\x86', b'\xe2\x80\xb0']
[b'\xc5\xa0', b'\xe2\x80\xb9', b'\xc5\x92', b'\xc5\xbd']
[b'\xe2\x80\x98', b'\xe2\x80\x99', b'\xe2\x80\x9c', b'\xe2\x80\x9d', b'\xe2\x80\xa2', b'\xe2\x80\x93', b'\xe2\x80\x94', b'\xcb\x9c', b'\xe2\x84\xa2']
[b'\xc5\xa1', b'\xe2\x80\xba', b'\xc5\x93', b'\xc5\xbe', b'\xc5\xb8']
Синтаксическая ошибка заключается в том, что вы указываете свой словарь обновления как {key,val.encode('utf-8')}
(который на самом деле является set
) вместо {key: val.encode('utf-8')}
. Тем не менее, в любом случае немного глупо использовать update
для обновления одного ключа, и таким образом вы перебираете список, вы просто будете многократно перезаписывать список каждым элементом по очереди (в конечном итоге заканчивая последним элементом) .
Вместо этого создайте новый список из закодированных значений и назначьте весь список для uni_dic[key]
:
for key in uni_dic:
encoded_vals = []
for val in uni_dic[key]:
encoded_vals.append(val.encode('utf-8'))
uni_dic[key] = encoded_vals
Использование спискового понимания для построения encoded_vals
сделает вас более кратким:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
А использование словарного понимания с dict.items()
делает это еще проще:
uni_dic = {k: [val.encode('utf-8') for val in v] for k, v in uni_dic.items()}
Для вашего первого решения я бы поместил encoded_vals = [] вне обоих циклов for, чтобы он повторялся по каждому ключу и значениям этого ключа, давая полный список каждого закодированного значения, а не только первого.
Я думаю, что эта часть должна быть uni_dic.update({key:val.encode('utf-8')}) заменить , на :