ValueError: 字典更新序列元素 #0 的长度为 N; 需要 2 个
ValueError: dictionary update sequence element #0 has length N; 2 is required
当我们错误地使用该方法时,就会出现Python“ValueError:字典更新序列元素#0的长度为N;需要2” dict.update()
。
要解决该错误,请将另一个字典或可迭代的键值对传递给该dict.update()
方法。
以下是错误发生方式的示例。
my_list = ['name'] my_dict = {'name': 'Alice'} # ⛔️ ValueError: dictionary update sequence element #0 has length 4; 2 is required my_dict.update(my_list)
我们dict.update()
用一维列表调用该方法,这导致了错误。
您可以使用以下方式调用该dict.update()
方法:
- 另一个包含键值对的字典。
my_dict = {'name': 'Alice'} # ✅ passing a dict to update() my_dict.update({'name': 'Bobby'}) print(my_dict) # {'name': 'Bobby'}
- 包含键值对的可迭代对象(例如列表),其中每个子列表的第一个元素是键,第二个元素是值。
my_dict = {'name': 'Alice'} # ✅ passing a list of key-value pairs to update() a_list = [('name', 'Bobby'), ('age', 30)] my_dict.update(a_list) print(my_dict) # {'name': 'Bobby', 'age': 30}
dict.upate()
使用字典调用该方法
dict.update()
可以使用字典或可迭代的键/值对(例如包含 2 个元素的元组列表)来调用该方法。
my_dict = {'name': 'Alice'} # ✅ pass dictionary to the update() method my_dict.update({'name': 'Bobby', 'age': 30}) print(my_dict) # 👉️ {'name': 'Bobby', 'age': 30}
上面的示例将字典参数传递给该update()
方法。
将可迭代的键值对传递给dict.update()
还可以使用可迭代的键/值对来调用该方法。
my_dict = {'name': 'Alice', 'age': 29} my_list = [('name', 'Bob'), ('age', 30)] my_dict.update(my_list) print(my_dict) # 👉️ {'name': 'Bob', 'age': 30}
我们将元组列表传递给该dict.update()
方法。每个元组必须包含 2 个元素 – 一个键和一个值。
使用该zip()
函数从 2 个可迭代对象创建字典
如果您有 2 个长度相等的可迭代对象(例如列表或元组)并且需要创建字典,请使用该zip()
函数。
my_keys = ['name', 'age'] my_values = ['Bobby', 29] my_dict = dict(zip(my_keys, my_values)) print(my_dict) # 👉️ {'name': 'Bobby', 'age': 29}
zip函数并行迭代多个可迭代对象,并使用每个可迭代对象中的一个项目生成元组。
该zip
函数返回元组的迭代器。
尝试将不兼容的值转换为字典
当我们尝试将错误值转换为字典时也会导致该错误。
my_str = 'hello' # ⛔️ ValueError: dictionary update sequence element #0 has length 1; 2 is required my_dict = dict(my_str)
以下是创建字典的所有不同方法。
a = dict(name='Alice', age=29) b = {'name': 'Alice', 'age': 29} c = dict(zip(['name', 'age'], ['Alice', 29])) d = dict([('name', 'Alice'), ('age', 29)]) e = dict({'name': 'Alice', 'age': 29}) f = dict({'name': 'Alice'}, age=29) print(a == b == c == d == e == f) # 👉️ True
所有示例都创建相同的字典 – {'name': 'Alice', 'age': 29}
.
dict.update方法使用提供的值中的键值对更新字典。
该方法覆盖字典的现有键并
返回 None。
该dict.update()
方法可以使用另一个字典或可迭代的键值对(例如每个包含 2 个元素的元组列表)来调用。
将字典的字符串表示形式转换为字典
如果您尝试将字典的字符串表示形式转换为字典,也会导致该错误。
from ast import literal_eval my_str = '{"id": 1, "name": "Bobby Hadz", "salary": 30}' # ⛔️ ValueError: dictionary update sequence element #0 has length 1; 2 is required print(dict(my_str))
解决该问题的一种方法是使用该ast.literal_eval()
方法。
from ast import literal_eval my_str = '{"id": 1, "name": "Bobby Hadz", "salary": 30}' my_dict = literal_eval(my_str) print(my_dict) # 👉️ {'id': 0, 'name': 'Bobby Hadz', 'salary': 30} print(type(my_dict)) # 👉️ <class 'dict'>
ast.literal_eval
方法允许我们安全地计算包含 Python 文字的
字符串。
使用该json.loads()
方法代替
或者,您可以使用该json.loads()
方法。
import json my_str = '{"id": 1, "name": "Bobby Hadz", "salary": 30}' my_dict = json.loads(my_str) print(my_dict) # 👉️ {'id': 1, 'name': 'Bobby Hadz', 'salary': 30} print(type(my_dict)) # 👉️ <class 'dict'>
我们使用该json.loads()
方法将字典的字符串表示解析为本机dict
对象。
json.loads()
请注意,仅当您具有有效的 JSON 字符串时才能使用该方法。例如,键和值必须用双引号引起来。如果键或值用单引号括起来,这将不起作用。
json.loads方法将JSON 字符串解析为本机 Python 对象。
使用PyYAML
模块
如果您的字符串不是有效的 JSON,您可以使用该PyYAML
模块。
首先,通过运行pip install pyyaml命令安装模块
。
pip install pyyaml pip3 install pyyaml
现在您可以导入该模块并使用它将字符串解析为本机 Python 字典。
import yaml my_str = "{'id': 1, 'name': 'Bobby Hadz', 'salary': 30}" my_dict = yaml.full_load(my_str) print(my_dict) # 👉️ {'id': 1, 'name': 'Bobby Hadz', 'salary': 30} print(type(my_dict)) # 👉️ <class 'dict'>
yaml.full_load()
方法获取 YAML 文档,对其进行解析并生成相应的 Python 对象。full_load()
请注意,不建议使用具有不受信任输入的方法。
如果您正在使用不受信任的数据,请改用该yaml.safe_load()
方法。
import yaml my_str = "{'id': 1, 'name': 'Bobby Hadz', 'salary': 30}" my_dict = yaml.safe_load(my_str) print(my_dict) # 👉️ {'id': 1, 'name': 'Bobby Hadz', 'salary': 30} print(type(my_dict)) # 👉️ <class 'dict'>
该yaml.safe_load()
方法加载 YAML 语言的子集。建议加载不受信任的输入。
解决使用Django时出现的错误
如果您在使用Django时遇到错误,请确保name
在urlpatterns
列表中指定关键字参数。
from django.urls import include, path urlpatterns = [ path('', views.home, name='home'), path('index/', views.index, name='main-view'), path('bio/<username>/', views.bio, name='bio'), path('articles/<slug:title>/', views.article, name='article-detail'), path('articles/<slug:title>/<int:section>/', views.section, name='article-section'), path('blog/', include('blog.urls')), # ... ]
如果忘记设置name
关键字参数,则会发生错误。
# ⛔️ causes error path('', views.home, 'home') # -------------------------------- # ✅ doesn't cause the error path('', views.home, name='home')
将关键字参数传递给dict.update()
方法
您还可以将关键字参数传递给该dict.update()
方法。
my_dict = dict(name='Alice', age=29) my_dict.update(name='Bob', age=30) print(my_dict) # 👉️ {'name': 'Bob', 'age': 30}
该代码示例dict.update()
使用name
和age
关键字参数调用该方法。
新值将覆盖指定属性的现有值。
我还写了一篇关于
如何在循环中向字典添加项目的文章。
额外资源
您可以通过查看以下教程了解有关相关主题的更多信息: