У меня есть такой список словарей:
list1 = [
{'id': b'1', 'ip': b'1.1.1.1'},
{'id': b'2', 'ip': b'2.2.2.2'}
]
Как я могу преобразовать каждое значение словарей в цикле for?
Сначала я попробовал это сделать, но у tuple нет назначения объекта:
for x in list1:
for y in x.items():
y[1] = y[1].decode('utf8')
print(x)
Не могли бы вы мне помочь?






Вызов .items() возвращает кортеж ключа и значений.
Если вы хотите просто перебрать значения, вместо этого вызовите .values(), а затем напрямую вызовите .decode() по значению:
for x in list1:
for y in x.values():
y.decode('utf8')
print(x)
Да, @ShadowRanger прав. Я не смог найти способ присвоить его переменной или даже способ создать новый список. Я действительно благодарен за ответ.
tuple — это поверхностная копия пары ключ/значение. Замена значений в tuple (что вы не можете сделать, но даже если бы могли) не изменит dict. Однако замените исходное значение dict, и оно будет работать нормально. Бонус: распакуйте результат .items() (это не только более читабельно, но и быстрее, чем повторное индексирование для загрузки):
for x in list1:
for k, v in x.items(): # Unpack to key value pairs
x[k] = v.decode('utf8') # Replace value of key with decoded value
print(x)
Также можно использовать понимание dict, создавая замену dict. Чтобы переназначить элементы list1, вам нужно либо вложить его в listcomp (что будет мешать print), либо использовать enumerate (чтобы иметь индекс для переназначения):
for i, x in enumerate(list1):
# Reassigning x as well lets us print it without looking it up again
list1[i] = x = {k: v.decode() for k, v in x.items()}
print(x)
Примечание. UTF-8 — это кодировка по умолчанию, используемая в Python 3, поэтому, как показано во втором примере кода, вы можете полностью опустить ее, и она все равно будет работать нормально.
Декодирование без переназначения (а переназначение невозможно, если у вас есть только значение, а не ключ) — это путаница; результат сразу выбрасывается и ничего не меняется.