use **kwargs to creat a dictionary-ValueError: dictionary update sequence element #0 has length 1; 2 is required

use **kwargs to creat a dictionary-ValueError: dictionary update sequence element #0 has length 1; 2 is required

我使用下面的代码来创建一个字典,使用逐行阅读的内容。

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里面的内容是这样的:

例如

农业 = ['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

所以我尝试这样直接使用变量"line"的内容(因为括号里的内容太长,我这里只显示两个。其实我是运行长版的在 Pycharm.):

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

那就对了!执行结果为:

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

那么为什么 ValueError:dictionary 更新序列元素 #0 的长度为 1; 2 是否需要发生?如何解决问题?

系统:Windows10

版本:Python3.6

编辑:Pycharm

因为line是一个str。解决这个问题的一种方法是使用 exec()。它将字符串作为 Python 命令执行。

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

print(D3)

输出 line = '农业 = ['A01C1','C12N15/90']':

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

您的文件内容不会被视为 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