2

这是问题的简化代码片段

>>> dict ({'A': 58, 'B': 130} for _ in range(1))
{'A': 'B'}

我期待它返回传入的同一个字典。

如果我做

>>> dict({'A': 58, 'B': 130})

我得到了我正在寻找的东西,那就是 {'A': 58, 'B': 130}

为什么这种行为不同,如何解决?我不能在那里改变表达式,但我可以以任何我喜欢的方式改变输入字典,例如,我可以像 [{'A': 58, 'B': 130}]

4

4 回答 4

5

一个 dict 可以用另一个 dict 或一个可迭代的对初始化,这就是你给它的。请注意,迭代 dict 只会产生它的键。

>>> d = {'A': 58, 'B': 130}
>>> list(d)
['A', 'B']
>>> dict([('A', 'B'), ('C', 'D')])
{'A': 'B', 'C': 'D'}
>>> dict([d, ('C', 'D')])
{'A': 'B', 'C': 'D'}

Python 的行为与指定的完全一致。你的 dict 恰好是一对。

于 2019-06-26T02:10:41.657 回答
2

您传递的 dict 有一些特别之处......({'A': 58, 'B': 130} for _ in range(1))代表长度为 1 的生成器序列。您传递的内容类似于

dict([{'A': 58, 'B': 130}])
# {'A': 'B'}

另一方面,这些将不起作用:

dict([{'A':58}])
# ValueError: dictionary update sequence element #0 has length 1; 2 is required

dict([{'A':58, 'B': 130, 'C': 150}])    
ValueError: dictionary update sequence element #0 has length 3; 2 is required

第一个示例有效,因为您的字典正好有两个条目

该序列被传递给该dict方法,该方法获取创建键值对所需的两项,并创建一个如下所示的字典:

{'A': 'B'}

IOW,它需要一个可迭代的对,这就是您的具有两个条目的单个 dict 的序列。其他任何东西都会抛出ValueError.

于 2019-06-26T02:13:45.153 回答
1

因为它只会成功['A', 'B']list还有:

>>> list({'A': 58, 'B': 130})
['A', 'B']
>>> 

dict并且由于它是一个字典列表,所以它会迭代,所以它会list适用于所有字典,所以:

>>> dict([{'A': 58, 'B': 130}])
{'A': 'B'}
>>> dict({'A': 58, 'B': 130})
{'A': 58, 'B': 130}
>>> 

此外,如果没有dict它,将对字典列表执行如下操作:

>>> {*{'A': 58, 'B': 130}}
{'A', 'B'}
>>> 

只是以类似字典的方式,但你现在应该得到它。

于 2019-06-26T02:13:12.910 回答
1

{'A': 58, 'B': 130} for _ in range(1)产量[{'A': 58, 'B': 130}],因此您将列表而不是字典传递给dict().

根据文档,如果您将一个可迭代对象传递给dict(),您将有效地得到:

d = {}
for k, v in iterable:
   d[k] = v

由于列表中的 dict 恰好有两个元素,因此for k,v in iterable:循环获取 dict 中的前两个键。如果 dict 只有一个或两个以上的元素,你会得到一个ValueError.

于 2019-06-26T02:14:23.643 回答