[英]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的定義)
要創建set
或dict
,鍵( 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.