Как добавить список из 2 элементов в словарь python в качестве пары ключ / значение?

#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'}