python - 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
解决方案
错误的原因是 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
模块进行该转换。
模块文档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]
这是一个示例,假设您在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.
推荐阅读
- swift - 斯威夫特: AVAssetReader.status 是 AVAssetReaderStatus
- linux - 看电影时如何防止swayidle执行
- c# - 如何将文件从 URL 下载到服务器文件夹
- java - java泛型中类型擦除的逻辑是什么?
- amazon-web-services - AWS lex 返回错误无效的 Lambda 响应
- flash - 无法打开 Flash exe 文件
- html - 如何创建从右到左的打字动画
- datatable - 根据媒体查询大小删除或隐藏特定(仅一个)数据表列
- r - 通过条件列表的子集
- wordpress - 带有页眉和页脚的 Wordpress 仪表板自定义选项