используйте ** kwargs для создания словаря-ValueError: элемент последовательности обновления словаря # 0 имеет длину 1;2 требуется - PullRequest
0 голосов
/ 12 декабря 2018

Я использую следующий код для создания словаря, используя содержимое, которое читается построчно.

with open(file='ipc_reference.txt', mode='r', encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines[:]:
        line = line.replace('\n', '')
        print(line)
        line_dic = dict(line)

содержимое в ipc_reference.txt выглядит следующим образом: the file's content

например,

农业 = ['A01C1','C12N15/90']
林业 = ['A01C1','A01H1']

, но выдает ошибку, подобную этой:

Traceback (most recent call last):
  File "E:/projects/ipc_industry/reference_and_count.py", line 10, in <module>
     line_dic = dict(line)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

Поэтому я пытаюсь напрямую использовать содержимое переменной "строка", как это (поскольку содержимое в скобках слишком длинное, я просто отображаю два здесь. На самом деле, я запускаю длинную версию в Pycharm.):

D3 = dict(农业 = ['A01C1','C12N15/90'],林业 = ['A01C1','A01H1'])
print(D3)

Тогда это правильно!Результат выполнения:

{'农业': ['A01C1', 'C12N15/90'], '林业': ['A01C1', 'A01H1']}

Так почему же ValueError: элемент последовательности обновления словаря # 0 имеет длину 1;2 обязательно происходит?Как решить проблему?

Система: Windows 10

Версия: Python 3.6

Редактор: Pycharm

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Содержимое вашего файла обрабатывается не как исходный код Python, а как строка.Конструктор dict, если ему дается итерация, не являющаяся отображением, будет обрабатывать его как итерацию из (key, value) пар.Строки являются итеративными символами, но конструктор dict не может распаковать отдельные символы в пары key, value, поэтому происходит сбой.

Что нам нужно сделать, это разбить каждую строку на =, оценить правую часть как литерал списка, а затем обновить наш текущий словарь:

from ast import literal_eval

with open(file='ipc_reference.txt', mode='r', encoding='utf-8') as f:
    d = {}
    for line in f:
        key, value = line.split(" = ", 1)  # This assumes the key cannot contain ' = ' 
        value = literal_eval(value)
        d[key] = value
0 голосов
/ 12 декабря 2018

Это потому, что line это str.Один из способов обойти это - использовать exec().Который выполняет строки как команды Python.

formatted = f'D3 = dict({line})'
exec(formatted)

print(D3)

Вывод, где line = '农业 = ['A01C1','C12N15/90']':

{'农业': ['A01C1', 'C12N15/90']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...