簡體   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