Skip to main content

Python 無序資料結構

  • 分為 set (#custom-id-set)
  • 分為 immutable frozenset (#custom-id-frozenset)

Python set 無序的資料結構 : set

  • 建構方式

    • s = set( [iterable] )
    • s = set((e1,e2,e3)) : built-in method, 傳入 tuple
    • s = set([e1,e2,e3]) : built-in method, 傳入 list
    • s = set('string') : string 也是 iterable
    • s = {e1, e2, e3} : 原生非物件的建立方式
  • set 中的 element 必須是 immutable

    • tuple: 小括號 (), 所建立的物件才是 immutable
    • list : 中括號 [], 所建立的物件是 mutable, 不可為 set element。拋出 TypeError: unhashable type
  • set 是可變的,可呼叫 set.add(el) 增加 element

# set constructor
s1 = {7,8,9,10}
for s in s1:
print(s)
print(s1)
# {8, 9, 10, 7}

# built-in method 來建立
s2 = set((7,8,9,10,11))
for s in s2:
print(s)
print(s2)
# {7, 8, 9, 10, 11}

# built-in method 來建立 : iterable String
s3= set('Hello World')
for s in s3:
print(s)
print(s3)
# {'d', 'r', 'H', 'e', ' ', 'W', 'o', 'l'}


# set 中的 element 必須是 immutable
l1 = (1,2,3) # tuple 是 immutable
l2 = (4,5,6)
l3 = [11,22,33] # list 是 mutable, 不可做為 set 的 neated element
s3 = {l1,l2, l3}
print(s3)
# TypeError: unhashable type

  • 建立 Empty Set: 建議使用 set() function

s_dic = {} # 注意,這邊建立的是 dic
s5 = {()} # 這邊是放進去一個空的colection object reference, 所以 set 本身非空

s6 = set() # OK, Empty
s7 = set([]) # OK, Empty
s8 = set({}) # OK, Empty

print('************')
print(type(s_dic))
print(len(s_dic))
# <class 'dict'>
# 0

print(type(s5))
print(len(s5))
# <class 'set'>
# 1

print(type(s6))
print(len(s6))
# <class 'set'>
# 0

print(type(s7))
print(len(s7))
# <class 'set'>
# 0

print(type(s8))
print(len(s8))
# <class 'set'>
# 0

print('************')
s5.add(1)
s5.add("A")
for x in s5:
print(x)
# 1
# A

Python immutable frozenset 無序的資料結構 : frozenset

  • 基本上與 set 的操作一致,僅差異在於建立後不可修改這件事。
  • 若不慎給予內容異動,注意 動作會被忽略 且系統並 ==不會報錯== 。
fs9 = frozenset(([1,2],3))  # list 是 mutable, 不可做為 set 的 neated element
print(fs9)
for x in fs9:
print(x)
# Process finished with exit code 1



fs10 = frozenset((1,2,3))
fs10.add(4) # 不可做異動
print(fs10)
# Process finished with exit code 1