首页 > 解决方案 > ValueError:字典更新序列元素 #0 的长度为 1;2 是必需的 Python 字典

问题描述

我目前遇到这个错误,我找不到问题。起初,我以为是因为在 中transformed_data[2],只有 1 个,但似乎并非如此。

ValueError:字典更新序列元素 #0 的长度为 1;2 是必需的

我的代码:

print(transformed_data)
country =transformed_data[0]
continent = transformed_data[1]
transformed_data[2] = transformed_data[2].replace("''",'test')
print(dict(transformed_data[2])) # when I add dict it does the error.
print((transformed_data[2])) # without dict, no error.

没有字典的外壳:

['Qatar', 'ASIA', '{2001: 41.215}', '{2001: 615000}']
{2001: 41.215}
['Cameroon', 'AFRICA', '{2001: 3.324}', '{2001: 16358000}']
{2001: 3.324}
['Democratic Republic of Congo', 'AFRICA', '{2006: 1.553}', '{2006: 56578000}']
{2006: 1.553}
['Bulgaria', 'EUROPE', '{2001: 48.923}', '{2001: 7931000}']
{2001: 48.923}
['Poland', 'EUROPE', '{2001: 306.696}', '{2001: 38489000}']
{2001: 306.696}
['Lesotho', 'AFRICA', "{1975: ''}", "{1975: '1161000'}"]
{1975: test}
['Albania', 'EUROPE', '{2002: 3.748}', '{2002: 3126000}']
{2002: 3.748}
['Colombia', 'SOUTH AMERICA', '{2001: 56.259}', '{2001: 39630000}']
{2001: 56.259}
['Pakistan', 'ASIA', '{2012: 166.33}', '{2012: 187280000}']
{2012: 166.33}

带字典的外壳:

Exception raised:
Traceback (most recent call last):
  File "/Applications/Thonny.app/Contents/Frameworks/Python.framework/Versions/3.7/lib/python3.7/doctest.py", line 1330, in __run
    compileflags, 1), test.globs)
  File "<doctest __main__.get_bar_co2_pc_by_continent[1]>", line 1, in <module>
    get_bar_co2_pc_by_continent(d1, 2001)
  File "/Users/bob/Desktop/python class/assignment/final/plot_data.py", line 33, in get_bar_co2_pc_by_continent
    print(dict(transformed_data[2]))
ValueError: dictionary update sequence element #0 has length 1; 2 is required

标签: pythondictionary

解决方案


错误的原因是 for 的语法dict()不需要字符串。您可以通过dict()以下方式使用:

dict([[2001, 41.215], [2002, 3.748]])

其中外部列表​​对应字典本身,每个内部列表对应一个键值对。不过,这可能不适用于您的输入数据,因此我还将提供一些其他提示。

编辑:如果您根本无法像您说的那样使用模块,并且如果您可以对数据输入做出假设,那么您当然可以拆分': '并将左侧转换为整数,将右侧转换为浮点数. 确保使用拼接 `s[1:-1] 删除外部花括号。

l = '{2001: 53.01}'[1:-1].split(': ')
d = dict([[int(l[0]), float(l[1])]])

如需使用标准库模块的更强大的解决方案,请继续阅读。/编辑

dict()无法将字符串转换为字典。请改用该json模块进行该转换。

模块文档jsonhttps ://docs.python.org/3/library/json.html

不幸的是,因为您使用整数作为字典的键,所以您仍然会遇到错误。该json模块只支持有效的 json,这意味着它只支持有string键。
这是有效的 json:'{"2001": 41.215}'
这不是有效的 json:'{2001: 41.215}'

如果您可以控制输入文本,那么最好将这些字典的键修改为字符串,方法是手动添加双引号,或者如果它们是生成的,然后修改执行此操作的脚本。

否则,您可以使用某种正则表达式替换来在读取数据之前自动修复数据:

import re
# Assumes that ALL of your keys have no decimal places, 
#   and that none of your values look like '2001:' 
new_text = re.sub(r'([1-9][0-9]*):', r'"\1":', text)

请记住,无论您选择哪种方法,当json模块创建您的字典时,它们都会有string键。如果您绝对必须使用integer键,您仍然可以在字典项上使用某种循环来转换键:

keys = d.keys()
for k in keys:
    d[int(k)] = d[k]
    del d[k]

这是一个示例,假设您在string所有情况下都事先将键转换为 s(替换dict()json.loads()):

import json

print(transformed_data)
country =transformed_data[0]
continent = transformed_data[1]
transformed_data[2] = transformed_data[2].replace("''",'test')
print(json.loads(transformed_data[2])) # Use json module instead.

推荐阅读