#python #python-3.x
#python #python-3.x
Вопрос:
Я хочу добавить содержимое списка из 2 элементов в словарь python (python3). Первый элемент — это ключ, второй элемент — значение.
Я следил за этой документацией, но, возможно, я неправильно понял содержимое.
Вот что я пытаюсь сделать
mydict = {"test": "1"}
key_value_pair = ["test2", "42"]
mydict.update(key_value_pair)
с ожидаемым результатом иметь dict с двумя записями:
{
"test": "1",
"test2" : "42"
}
но вместо этого я получаю сообщение об ошибке ValueError: dictionary update sequence element #0 has length 5; 2 is required
.
Конечно, я могу сделать это следующим образом:
mydict[key_value_pair[0]] = key_value_pair[1]
но идея состоит в том, чтобы разделить строку и использовать два элемента непосредственно в качестве пары ключ / значение:
mystring = "test2=42"
mydict.update(mystring.split("="))
вместо
mystring = "test4=42"
splitted_string = mystring.split("=")
mydict[splitted_string[0]] = splitted_string[1]
Надеюсь, вы понимаете смысл…
Комментарии:
1.
mydict.update((["test2", "42"],))
.2. Обратите внимание на наличие
,
.3. Да, я видел
,
, что это был «ключ»… Отлично, спасибо
Ответ №1:
но идея состоит в том, чтобы разделить строку и использовать два элемента непосредственно в качестве пары ключ / значение:
Если вы хотите разделить строку и использовать два элемента непосредственно как пару ключ / значение, то я думаю, что это самый простой способ:
mydict = {"test": "1"}
mydict.update(["test2=42".split("=")]) # this statement
print(mydict)
Это печатается, как и ожидалось:
{'test': '1', 'test2': '42'}
Ответ №2:
Из документации:
update()
принимает либо другой объект словаря, либо итерацию пар ключ / значение (в виде кортежей или других итераций длиной два).
В случае вашего кода возникло исключение, потому "test2"
что это итерируемый, но длиной 5, а не 2.
Вы могли бы, например, обернуть свой список из 2 в другой список, чтобы он работал:
>>> mydict = {"test": "1"}
... key_value_pair = ["test2", "42"]
... mydict.update([key_value_pair])
>>> mydict
{'test': '1', 'test2': '42'}
Ответ №3:
Из документов:
Обновите словарь парами ключ / значение из других, перезаписав существующие ключи. Возвращает None.
update()
принимает либо другой объект словаря, либо итерацию пар ключ / значение (в виде кортежей или других итераций длиной два). Если указаны аргументы ключевого слова, словарь затем обновляется этими парами ключ / значение :d.update(red=1, blue=2)
.
Поэтому, когда вы предоставляете an iterable
, он ожидает, что каждый элемент iterable будет парой ключ-значение.
Вот почему это работает:
kvp = ["newkey", "newval"]
mydict.update([kvp])
Каждый элемент итерируемого ввода представляет собой список из 2 элементов.
Когда вы делаете просто
mydict.update(kvp)
update()
пытается гарантировать, что каждый элемент kvp
является 2-элементным итерируемым. Поскольку строки можно повторять, вы получаете сообщение об ошибке, что длина элемента недопустима.
Примечание: если kvp
содержатся целые числа или что-то, что не может быть повторено:
kvp2 = [0, 42]
mydict.update(kvp2)
Вы получите эту ошибку
Ошибка типа: не удается преобразовать элемент последовательности обновления словаря # 0 в последовательность
Итак, чтобы обновить dict результатом split()
операции, вам просто нужно обернуть этот список в другой итерируемый (список в следующем примере).
mystring = "test2=42"
mydict.update([mystring.split("=")])
Теперь, если вы хотели, чтобы этот итерируемый объект был кортежем, есть небольшая ошибка. Просто обертывание mystring.split()
в скобках следующим образом: (mystring.split("="))
не создаст кортеж. Вместо этого вам нужно добавить запятую (mystring.split("="), )
, чтобы получить ее для создания кортежа.
t1 = (mystring.split("="))
print(type(t1))
# Output: list
t2 = (mystring.split("="), )
print(type(t2))
# Output: tuple
mydict.update((mystring.split("="), ))
Если бы у вас был список N
строк, которые чередовались между ключами и значениями, было бы довольно легко преобразовать его в N/2 x 2
список пар ключ-значение:
mydict = {"test": "1"}
all_kvp = ["key1", "val1", "key2", "val2", "key3", "val3"]
kvp = [(k, v) for k, v in zip(all_kvp[::2], all_kvp[1::2])] # creates a list-of-tuples, but a list-of-lists would also work.
mydict.update(kvp)
# mydict: {'test': '1', 'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}