簡體   English   中英

dict 和 set 的區別(python)

[英]Difference between dict and set (python)

所以,我知道這個,

a = {}  # dict

構造一個空字典。 現在,我也發現了這個,

b = {1, 2, 3}  # set

創建一個集合。 這很容易驗證,因為,

>>>print(type(a))
<class 'dict'>

>>>print(type(b))
<class 'set'>

雖然我理解它的作用,但我不明白為什么我們對空字典使用“集合表示法”。 我試圖在手冊的setdict部分找到更多關於這背后邏輯的信息,但遺憾的是,我一無所獲。

誰能向我解釋為什么我們這樣做? 是出於歷史原因,還是我遺漏了一些明顯的東西?

Python 2 中沒有集合文字,歷史上大括號僅用於字典。 集合可以從列表(或任何可迭代對象)中生成:

set([1, 2, 3])
set([i for i in range(1, 3)])

Python 3 引入了集合文字和推導式(參見PEP-3100 ),這讓我們可以避免使用中間列表:

{1, 2, 3}
{i for i in range(1, 3)}

但是,由於向后兼容,空集形式是為字典保留的。 P3K 中 [Python-3000] 集的引用? 狀態:

我相信我們可以解決一些問題 --- 我同意, {}用於空集和{:}用於空 dict 將是理想的,如果不是為了向后兼容。 當我第一次編寫 PEP 時,我喜歡“特殊空對象”的想法(即,讓{}成為可以變成集合或字典的東西),但這里的一位講師說服我,這只會導致混淆新人的想法(以及實施起來的痛苦)。

以下消息更好地描述了這些規則:

我認為 Guido 有最好的解決方案。 set()用於空集,將{}用於空字典,將{genexp}用於集合推導/顯示,將{1,2,3}用於顯式集合文字,將{k1:v1, k2:v2}用於字典文字。 如果需求超過厭惡,我們總是可以稍后添加{ / }

語法一樣。 字典首先使用花括號,然后指定鍵值對,其中鍵和值由冒號分隔:

>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>

后來集合被添加到語言中, {..}大括號符號只命名元素,而不是對:

>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>

請注意,在 Python 2 中,解釋器使用可調用的set()來回顯對象。 這也是您指定集的方式:

>>> emptyset = set()

在 Python 3 中,回顯對象時使用較新的{..}表示法,除非它為空:

>>> {'foo'}
{'foo'}
>>> _ - {'foo'}  # difference, removing the one element
set()

set()類型在2.4 版中被添加到 Python 語言中(參見PEP 218 ),集合文字的花括號語法被添加到 Python 3 中並向后移植到 Python 2.7中。

{}用於空字典而不是空集這一事實在很大程度上具有歷史原因。 字典的語法{'a': 100, 'b': 200}自 Python 誕生以來就已經存在。 集合的語法{1, 2, 3}是在 Python 2.7 中引入的。 由於{}已經使用了很長時間,它將作為定義空字典的方式保留下來。 如果 Python 從一開始就有新的集合語法,那么可能會用{}定義一個空集合,用{:}定義一個空字典。

集合是無序的集合。 字典是一種無序的數據集合,以鍵值對的形式存儲數據。 字典和集合使用哈希表來實現 O(1) 查找和插入。 數據結構文檔參考: https ://docs.python.org/3/tutorial/datastructures.html

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM