繁体   English   中英

dict(list(tuple))vs {list(tuple)}?

[英]dict(list(tuple)) vs {list(tuple)}?

为什么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构造函数与将其用大括号括起来完全不同。

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

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

当你只写{thing} ,Python看到你写一个单一的项目,而不是键值对,和它,而不是试图构建一个包含单个元素集合thing 这失败了,因为花括号中的东西是一个列表,并且列表不可散列。

使用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的文档:

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

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


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

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

但是在这里,您使用了一个list元素,它是一个可变容器,并且不可哈希,从而导致错误:

TypeError: unhashable type: 'list'

为什么列表不能成为字典键有一个很好的解释 ,并且相同的行为也适用于set成员。

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常量 它创建一个新set ,而不是dict对于dict文字,您至少需要一对两个值之间用冒号分隔。 (不要问我为什么;)。 这是Python的定义)

要创建setdict ,键( dict )或值(of set )必须是可哈希的。 定义说:

如果对象的哈希值在其生命周期内从未发生变化,则该对象是可哈希的

list是可变序列。 因此list是不可散列的。 这就是为什么您收到错误消息

TypeError: unhashable type: 'list'

如果要使用list(tuple)括号创建新的dict ,则可以使用dict comprehension (但仅在Python 3上受支持)

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

P / S: dict文字dict()性能更高

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM