dict(列表(元组))与{list(元组)}



为什么dict(list(tuple))有效而{list(tuple)}无效例如

>>> dict([('b', 456), ('a', 123)])
{'a': 123, 'b': 456}
>>> {[('b', 456), ('a', 123)]}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

CPython代码的哪一部分允许dict([('b', 456), ('a', 123)])

{}可用于集合和字典。例如,{8: 2}是一个字典,但{1, 2, 3, 4}是一个集合。由于您没有给出键,Python假设您想要一个集。一个集合取决于是否有可散列的项目,所以当你给它一个列表时,它会抱怨。

如果你想使用文字,请尝试理解:

{k: v for k, v in mylist}

就像使用["asdf"]list("asdf")str(thing)"thing"一样,对一个事物调用dict构造函数所做的事情与用大括号包围它完全不同。

当你用大括号构造dict时,你应该显式地写出键值对:

{'b': 456, 'a': 123}

当您刚编写{thing}时,Python会看到您编写了一个单独的项,而不是键值对,它会尝试构建一个包含该thing的单个元素集。这是失败的,因为大括号中的内容是一个列表,而列表是不可哈希的。

当你用dict构造函数构造dict时,你可以传入一个用于初始化dict的对象。这个对象可以是另一个映射,它将被复制到dict中,也可以是一系列用元组表示的键值对:

dict([('b', 456), ('a', 123)])

不能使用冒号表示法:

dict('b': 456, 'a': 123)  # Syntax error

可以使用关键字参数,因为构造函数还允许您提供字符串键作为关键字参数,大括号表示法不支持这种语法:

dict(b=456, a=123)  # Works
{b=456, a=123)  # Syntax error

dict是一个类,当您使用dict(list(tuple))时,它会使用构造函数实例化该类。

查看dict:的文档

Dictionary可以通过在大括号内放置key: value对的逗号分隔列表来创建,例如:{'jack': 4098, 'sjoerd': 4127}{4098: 'jack', 4127: 'sjoerd'},或者通过dict构造函数来创建。

如果没有给出位置参数,则会创建一个空字典。如果给定了一个位置参数,并且它是一个映射对象,则会使用与映射对象相同的key-value对创建字典。否则,位置参数必须是iterable对象iterable中的每个项目本身都必须是一个正好有两个对象的iterable。每个项目的第一个对象成为新字典中的键,第二个对象成为相应的值如果一个键出现多次,则该键的最后一个值将成为新字典中的相应值。


当您使用{list(tuple)}时,它会尝试创建一个set对象。

集合对象是不同hashable对象的无序集合。

但这里使用了一个列表元素,它是一个可变容器,不可哈希,这导致了错误:

TypeError: unhashable type: 'list'

"为什么列表不能成为字典键?"有一个很好的解释?,同样的行为也适用于集合成员。

dict(list(tuple))使用dict()构造函数创建一个新的dict。以下是他做的事情

def __init__(self, seq=None, **kwargs): # known special case of dict.__init__
"""
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list.  For example:  dict(one=1, two=2)
"""

如果使用{list(tuple)},则使用集文字。它创建了一个新的set,而不是dict对于dict literals,您至少需要一对由冒号分隔的两个值。(不要问我为什么;)。这是Python的定义)

要创建setdict,(dict的)键或(set的)值必须是可散列的。定义是:

如果对象具有从不更改的哈希值,则该对象是可哈希的

list是一个可变序列。所以list是不可破解的。这就是你收到错误信息的原因

TypeError: unhashable type: 'list'

如果要从list(tuple)使用大括号创建一个新的dict,可以使用dictcomplexing。(但仅在Python 3上受支持)

{a,b for a,b in list(tuple)}

p/S:dict literals的性能略高于dict()

最新更新