【问题标题】:ValueError: dictionary update sequence element #0 has length 1; 2 is required Python DictionaryValueError:字典更新序列元素 #0 的长度为 1; 2 是必需的 Python 字典
【发布时间】:2021-04-01 14:03:14
【问题描述】:

我目前遇到了这个错误,我找不到问题。一开始我以为是因为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.

没有字典的shell:

['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

【问题讨论】:

  • 嗨@mkrieger1,谢谢你的建议,但我不允许使用任何模块,所以这不适用于我的情况
  • 也许解决方案是 transformed_data[2] 首先不应该是一个字符串。它来自哪里?
  • @mkrieger1 是教授要求的。这是代码中的另一个函数,它将所有内容都放入字符串中,然后在这段代码中,我必须从该字符串中获取值
  • @mkrieger1 我已经浏览了您链接的整个线程,他们只是拆分并替换它,这就是我最终要做的。我想从心底里感谢你。最后,我可以继续努力完成这个项目。圣诞快乐!

标签: python dictionary


【解决方案1】:

错误的原因是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 模块进行转换。

json 模块的文档:https://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]

这是一个示例,假设您在所有情况下都事先将密钥转换为 strings(将 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.

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 1970-01-01
    • 2017-12-27
    • 2016-02-17
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多