面試題-python3 里面的集合(set)到底是有序還是無序的?


前言

集合,簡稱集,是數學中一個基本概念,主要有以下兩個特征:

  • 一個集合中,任何兩個元素都認為是不相同的,即每個元素只能出現一次
  • 一個集合中,每個元素的地位都是相同的,元素之間是無序的。

集合(set)

集合(set)是一個無序的不重復元素序列。可以使用大括號 { } 或者 set() 函數創建集合。
注意:創建一個空集合必須用 set() 而不是 { },因為 { } 是用來創建一個空字典。

# 定義空集合
a = set()
print(a)   # set()

# 會去除重復元素
b = set('acbabdef')
print(b)   # {'f', 'd', 'b', 'c', 'e', 'a'}

前面講到一個列表生成可以用列表推倒式,使用中括號[]

c = [i for i in range(10)]
print(c)   # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

那么集合也有集合推倒式,使用大括號{}

d = {i for i in range(10)}
print(d)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

2個集合之間的運算

f1 = {"a", "b", "c", "d"}
f2 = {"a", "d", "e", "f"}

# 1.集合a中包含而集合b中不包含的元素
print(f1 - f2)
# 2.集合a或b中包含的所有元素
print(f1 | f2)
# 3.集合a和b中都包含了的元素
print(f1 & f2)
# 4.不同時包含於a和b的元素
print(f1 ^ f2)

運行結果

{'b', 'c'}
{'b', 'a', 'f', 'c', 'd', 'e'}
{'d', 'a'}
{'b', 'f', 'c', 'e'}

集合是有序還是無序?

有時候我們會有一種錯覺,認為集合是有序的,先看下面一個案例

# 去除a里面的重復元素

a = [1, 3, 2, 6, 2, 4, 3, 1, 2]
print(set(a))

# 轉list
print(list(set(a)))

得到的結果

{1, 2, 3, 4, 6}
[1, 2, 3, 4, 6]

從結果看,發現使用集合去重后,自動從小到大排序了,於是容易產生一個誤區,得出集合會自動排序。
這里排序的主要原因是python3版本,對於數據量很小的集合並且數字很少的時候,確實是做了一個排序。接下來把數字調大一點再看

# 去除a里面的重復元素

a = [1, 3, 122, 6, 2, 4, 3, 1, 2, 22, 34, 22, 99, 200]
print(set(a))

# 轉list
print(list(set(a)))

# 運行結果
{1, 2, 3, 4, 34, 6, 99, 200, 22, 122}
[1, 2, 3, 4, 34, 6, 99, 200, 22, 122]

這時候會發現,沒按從小到大排序,接着把數字換成英文字符

a = ["a", "b", "c", "d", "a", "c"]
print(set(a))

# 轉list
print(list(set(a)))

運行結果:

{'b', 'c', 'a', 'd'}
['b', 'c', 'a', 'd']

每次運行的結果都不一樣,說明集合是無序的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM