ValueError:字典更新序列元素#0的长度为N;需要 2 个

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()方法。

valueerror字典更新序列元素0有长度

以下是错误发生方式的示例。

main.py
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()用一维列表调用该方法,这导致了错误。

您可以使用以下方式调用该dict.update()方法:

  • 另一个包含键值对的字典。
main.py
my_dict = {'name': 'Alice'} # ✅ passing a dict to update() my_dict.update({'name': 'Bobby'}) print(my_dict) # {'name': 'Bobby'}
  • 包含键值对的可迭代对象(例如列表),其中每个子列表的第一个元素是键,第二个元素是值。
main.py
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 个元素的元组列表)来调用该方法。

main.py
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()

还可以使用可迭代的键/值对来调用该方法。

main.py
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()函数。

main.py
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函数返回元组的迭代器。

尝试将不兼容的值转换为字典

当我们尝试将错误值转换为字典时也会导致该错误。

main.py
my_str = 'hello' # ⛔️ ValueError: dictionary update sequence element #0 has length 1; 2 is required my_dict = dict(my_str)

以下是创建字典的所有不同方法。

main.py
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 个元素的元组列表)来调用。

将字典的字符串表示形式转换为字典

如果您尝试将字典的字符串表示形式转换为字典,也会导致该错误。

main.py
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()方法。

main.py
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 文字

字符串。

字符串可以由字符串、字节、数字、元组、列表、字典、集合、布尔值和 None 组成。

使用该json.loads()方法代替

或者,您可以使用该json.loads()方法。

main.py
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 字典。

main.py
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()方法。

main.py
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时遇到错误,请确保nameurlpatterns列表中指定关键字参数。

urls.py
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()方法。

main.py
my_dict = dict(name='Alice', age=29) my_dict.update(name='Bob', age=30) print(my_dict) # 👉️ {'name': 'Bob', 'age': 30}

该代码示例dict.update()使用nameage关键字参数调用该方法。

新值将覆盖指定属性的现有值。

我还写了一篇关于
如何在循环中向字典添加项目的文章。

额外资源

您可以通过查看以下教程了解有关相关主题的更多信息: