【问题标题】:Tuple to Dict :: TypeError: cannot convert dictionary update sequence element #0 to a sequenceTuple to Dict :: TypeError: cannot convert dictionary update sequence element #0 to a sequence
【发布时间】:2017-10-06 20:13:26
【问题描述】:

这工作正常:

In [104]: i = [(1, 'a')]
In [105]: dict(i)
Out[105]: {1: 'a'}

似乎我有一个包含一个元组的列表,我在其上调用了 dict() 函数,它返回了一个字典。

我没有因为通话而改变:

In [114]: i
Out[114]: [(1, 'a')]

如果我试试这个:

 In [108]: i = (1, 'a')
 In [109]: dict(i)

我得到 TypeError: cannot convert dictionary update sequence element #0 to a sequence.

我认为这是因为元组是不可变的。如果是真的,我并没有改变任何东西,对吧?

在上面的工作示例中,i 仍然只是 i。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    dict() 期望您传递 mapping object 或键值对的可迭代对象(每个键值对都必须是 2 元素可迭代对象)。

    二元组列表是后者,单个二元组都不是。

    【讨论】:

    • 谢谢。我看不出 2 元组是如何工作的。它是具有 2 个元素的可迭代对象,可用于 key : value。我需要至少两个元组吗?
    • 这不是dict 的实现方式。它期望一个可迭代的键值对,而不是单个键值对。
    • 您可以给它一个键:值,但您必须将它包装在两层可迭代中 - 就像您在问题的第一个示例中所做的那样。
    • 这似乎是关键 - 将其包装成两层可迭代对象。
    【解决方案2】:

    来自 python 文档 (link):

    类字典(**kwarg)

    类字典(映射,**kwarg)

    类 dict(iterable,**kwarg)

    返回一个从可选位置参数和一组可能为空的关键字参数初始化的新字典。

    如果没有给出位置参数,则创建一个空字典。如果 给出了一个位置参数,它是一个映射对象,a 字典是使用与映射相同的键值对创建的 目的。否则,位置参数必须是可迭代对象。 可迭代对象中的每个项目本身都必须是具有恰好两个的可迭代对象 对象。每个项目的第一个对象成为新的键 字典,第二个对象对应的值。如果一个键 多次出现,该键的最后一个值成为 新字典中的对应值。

    如果给出了关键字参数,则关键字参数及其值 被添加到从位置参数创建的字典中。如果一个 添加的键已经存在,关键字的值 参数替换位置参数的值。

    您正在传递一个可迭代的元组,因此 python 正在迭代它试图扩展 2(键和值)中的成员并失败,因为成员不是可以分配给键和值的 2 成员迭代。

    【讨论】:

    • 这是我的困惑。似乎 2 元组是 2 成员可迭代,因为它有 2 个成员并且可以迭代。似乎它可以只分配 1 => 'a'
    • “可迭代对象中的每个项目本身必须是包含两个对象的可迭代对象。” - 你必须传递一个 iterable 的 2-member iterables。这个外部迭代可以包含一个 2 成员迭代,但你不能只传递一个“裸”的 2 成员迭代。
    • 好的,那么我想我们可以说“一个 2 元组的元组满足 dict() 函数,但只是有一个“裸” - 正如你所说 - 2 元组不会”。 (除非裸 2 元组被列表覆盖)。
    【解决方案3】:

    dict 需要一个序列序列,所以当你给它一个一维序列时它会失败。您可以使用元组而不是列表。

    d = dict(((1, 1), (2, 2)))
    

    给我们

    {1: 1, 2: 2}
    

    【讨论】:

    • tks。这对我来说实际上失败了:TypeError: dict expected at most 1 arguments, got 2 w/python 2 or 3.
    • 需要更多括号:d = dict(((1, 1), (2, 2))) - 最外面的一组是函数调用括号。
    • 太棒了。虽然有点令人困惑的是为什么包裹在一个元组中的 2 元组不起作用。但我认为我们现在处于困境之中,它就是如上实施的。
    • 我怀疑你在一个元组中的元组看起来像((1, 1))。这实际上计算为(1, 1),原因与(1/2) 不是元组的原因相同。长度为 1 的元组有一个尾随逗号 ((1, 1),)
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2015-11-08
    • 2019-07-18
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多