【问题标题】:"dictionary update sequence element #0 has length 4; 2 is required"“字典更新序列元素 #0 的长度为 4;需要 2”
【发布时间】:2020-12-14 23:09:47
【问题描述】:

尝试使用元组更新字典时,遇到错误:

>>> dict1.update(("stat",10))

ValueError: dictionary update sequence element #0 has length 4; 2 is required

实际上这不应该发生。来自 python 文档,

update() 接受另一个字典对象或键/值对的可迭代对象(作为元组或其他长度为 2 的可迭代对象)。

这是没有意义的,因为我提供的元组显然长度为 2。

>>> len(("stat",10))

2

发生了什么事?这是一个尚未解决的错误吗?运行 Python 3.8.0。

还是因为我的字典是空的?用其他字符串和值试过这个,同样的问题。

【问题讨论】:

  • 我知道这个修复。但我不想仅仅为了处理这个问题而建立一个临时字典。构建元组更快。我也很好奇这个问题/错误的起源。
  • 试试dict1.update({"stat": 10})
  • 问题是它想要一个可迭代的对,但你直接传递了一对;缺少一级数据结构。您需要将该级别的数据结构放入,dict1.update((("stat", 10),)),它是一个 tuple 对,或者 dict1.update([("stat", 10)]),它是一个 list 对。
  • 找到的长度是字符串“stat”的长度

标签: python dictionary


【解决方案1】:

文档说您需要一个可迭代键值对。单个元组不是键值对的可迭代对象,列表或元组都可以。

dict1.update([("stat", 10)])

【讨论】:

  • 哪个更快?一个新的临时字典或元组的元组。从逻辑上讲,元组应该更快,但我可能错了
  • 元组应该更快并且使用更少的内存。
  • 我怀疑速度/内存差异会很小,在绝大多数情况下当然不值得担心。
【解决方案2】:

在元组末尾添加一个 , dict1.update((("stat",10),)) 或者传递一个列表dict1.update([("stat",10)])

【讨论】:

    【解决方案3】:

    文档说“或键/值对的可迭代对象(作为元组或其他长度为 2 的可迭代对象)”。

    因此,您需要将长度为 2 的元组传递给它

    试试这个:

    dict1.update((("stat",10),))
    

    或者您可以传递多个键/值对,如下所示:

    dict1.update((("stat",10), ('foo', 'bar'), ('buzz', 'fizz')))
    

    【讨论】:

    • 奇怪的是它不能只使用一个元组。
    • 所以单个 2 长度元组永远不会工作?这是有问题的,因为我必须在循环中逐个添加每个值。
    • Afaik,它只会以这种方式工作。我发现另一个线程解释了同样的事情:stackoverflow.com/a/11746698/1331040
    • 只有一个元组,后面要加逗号:dict1.update((("stat",10),))
    • @sabik 感谢您的澄清。我只是想通过传递多对来展示传递元组的概念。
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2023-04-06
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多