Ошибка создания словаря Python - PullRequest
5 голосов
/ 23 октября 2009

Я пытаюсь создать словарь Python из сохраненного списка. Этот первый метод работает

>>> myList = []
>>> myList.append('Prop1')
>>> myList.append('Prop2')
>>> myDict = dict([myList])

Однако следующий метод не работает

>>> myList2 = ['Prop1','Prop2','Prop3','Prop4']
>>> myDict2 = dict([myList2])
ValueError: dictionary update sequence element #0 has length 3; 2 is required

Поэтому мне интересно, почему первый метод, использующий метод добавления, работает, а второй не работает? Есть ли разница между myList и myList2?

Редактировать

Проверено снова myList2 на самом деле имеет более двух элементов. Обновлен второй пример, чтобы отразить это.

1 Ответ

13 голосов
/ 23 октября 2009

Вы делаете это неправильно.

Конструктор dict() не принимает список элементов (тем более, список, содержащий один список элементов), он принимает итерацию из 2-элементных итераций. Так что если вы изменили свой код на:

myList = []
myList.append(["mykey1", "myvalue1"])
myList.append(["mykey2", "myvalue2"])
myDict = dict(myList)

Тогда вы получите то, что ожидаете:

>>> myDict
{'mykey2': 'myvalue2', 'mykey1': 'myvalue1'}

Причина, по которой это работает:

myDict = dict([['prop1', 'prop2']])
{'prop1': 'prop2'}

Это потому, что он интерпретирует его как список, который содержит один элемент, который является списком, который содержит два элемента.

По сути, конструктор dict принимает свой первый аргумент и выполняет код, подобный следующему:

for key, value in myList:
    print key, "=", value
...