集合(set) :目錄

  • 集合(set)介紹
    • 集合 v.s. 字典
    • 使用集合的時機
    • 集合理論
  • 建立集合【使用 set()】
    • 建立集合
    • 空集合
  • 轉換其他類型【使用 set()】
    • 字串 → 集合(丟棄任何重複的字元)
    • 串列 → 集合
    • Tuple → 集合
    • 字典 → 集合
  • 使用 in 來測試值
    • 集合【字典 = {鍵:{集合 = 一系列的值}}】
    • 集合 v.s. 字典
    • 由「集合」尋找「鍵」【使用 for, in, items(), if, print()】
    • 由「集合」尋找「鍵」,但有排除條件
  • 結合與運算子
    • 交集【使用 & 或 intersection()】
    • 將「集合」存在「變數」內,節省打字次數
    • 聯集【使用 | 或 union()】
    • 差集【使用 - 或 difference()】
  • 以上,是最常見的集合運算子
    • 互斥【使用 ^ 或 symmetric_difference()】
    • 子集合【使用 <= 或 issubset()】
    • 真子集(proper subset)【使用 < 】
    • 超集合(superset)【使用 >= 或 issuperset()】
    • 真超集合【使用 > 】

集合(set)介紹

集合 v.s. 字典

  • 集合,就像是被移除值只留下鍵的字典
  • 跟字典一樣,每一個鍵都必須是獨一無二
  • 跟字典的鍵一樣,集合是無序的

使用集合的時機

  • 使用集合的時機:只想要知道某個東西是否存在,其他都無所謂
  • 使用字典的時機:想要將某些資訊指派給鍵來作為它的值

集合理論

  • 聯集
  • 交集
  • null 或 空集合:是指含有零個元素的集合

建立集合【使用 set()】

建立集合

建立集合,可以使用 set()函式,或是將一或多個以逗號分隔的值包在大括號裡面

  1. 集合名稱 = {值1, 值2, 值3, 值4, 值5}
  2. 集合名稱
  3. {值1, 值2, 值3, 值4, 值5}
>>> even_numbers = {0, 2, 4, 6, 8}
>>> even_numbers
{0, 2, 4, 6, 8}

>>> odd_numbers = {1, 3, 5, 7, 9}
>>> odd_numbers
{1, 3, 5, 7, 9}

空集合

  • 空串列:[]
  • 空字典:{} → 在 Python 中,字典可優先取用大括號
  • 空集合:set()
  1. 集合名稱 = set()
  2. 集合名稱
  3. set()
>>> empty_set = set()
>>> empty_set
set()

轉換其他類型【使用 set()】

可能會用串列、字串、tuple 或字典來建立集合,並丟棄任何重複的值

字串 → 集合(丟棄任何重複的字元)

  1. set( '字元1字元2字元3字元1' )
  2. {'字元1', '字元2', '字元3'}
>>> set( 'letters' )
{'s', 'r', 'e', 'l', 't'}

串列 → 集合

  1. set( [字串1, 字串2, 字串3, 字串4] )
  2. { 字串1, 字串2, 字串3, 字串4 }
>>> set( ['Dasher', 'Dancer', 'Prancer', 'Mason-Dixon'] )
{'Dasher', 'Mason-Dixon', 'Dancer', 'Prancer'}

Tuple → 集合

  1. set( (字串1, 字串2, 字串3, 字串4) )
  2. { 字串1, 字串2, 字串3, 字串4 }
>>> set( ('Ummagumma', 'Echoes', 'Atom Heart Mother') )
{'Atom Heart Mother', 'Echoes', 'Ummagumma'}

字典 → 集合

  1. set( {鍵1:值1, 鍵2:值2, 鍵3:值3} )
  2. { 鍵1, 鍵2, 鍵3 }
>>> set( {'apple': 'red', 'orange': 'orange', 'cherry': 'red'} )
{'apple', 'cherry', 'orange'}

使用 in 來測試值

集合【字典 = {鍵:{集合 = 一系列的值}}】

  • 這是集合最常用到的。建立一個「字典」,其中每個「鍵」都是一種名稱,它對應的「值」是它的材料「集合」
  • 字典 = {
    鍵1(名稱1) : {值1, 值2},
    鍵2(名稱2) : {值1, 值3},
    鍵3(名稱3) : {值1, 值3, 值4}
    鍵4(名稱4) : {值2, 值5, 值6}
    鍵5(名稱5) : {值1, 值7}
    }
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

值1:vodka
值2:vermouth
值3:kahlua
值4:cream
值5:rye
值6:bitters
值7:orange juice

集合 v.s. 字典

  • 集合:集合名稱 = {值1, 值2, 值3, 值4} → 一系列的值
  • 字典:字典名稱 = {鍵1:值1, 鍵2:值2, 鍵3:值3} → 一或多個「鍵:值」對

由「集合」尋找「鍵」【使用 for, in, items(), if, print()】

for name, contents in 字典名稱.items():
if '值1' in contents:
print(name)
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}


>>> for name, contents in drinks.items():
    if 'vodka' in contents:
        print(name)


martini
black russian
white russian
screwdriver

由「集合」尋找「鍵」,但有排除條件

【方法一】使用 for, in, items(), if, print(), not

>>> for name, contents in 字典名稱.items(): 
    if '值1' in contents and not ('值2' in contents or '值4' in contents): 
    print(name)
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}


>>> for name, contents in drinks.items():
    if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
        print(name)


black russian
screwdriver

【方法二】使用 &, for, in, items(), if, print(), not

>>> for name, contents in 字典名稱.items(): 
    if '值1' in contents and not contents & {'值2', '值4'}:
    print(name)
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}


>>> for name, contents in drinks.items():
    if 'vodka' in contents and not contents & {'vermouth', 'cream'}:
        print(name)


black russian
screwdriver

結合與運算子

運算子,有一些會使用特殊的標點符號,有一些會使用特殊函數,有些同時使用兩者。

交集【使用 & 或 intersection()】

  • & 運算子會產生一個集合,裡面存有你所比較的兩個串列內都有的項目。如果 contents 裡面沒有任何那些材料,& 會回傳一個空集合,它會被視為 False

方法一:【使用 & 】

  • & 符號來取得交集(兩組集合共有的項目)

值1:vodka 值2:vermouth 值3:kahlua 值4:cream 值5:rye 值6:bitters 值7:orange juice

  • 字典 = {
    鍵1(名稱1) : {值1, 值2},
    鍵2(名稱2) : {值1, 值3},
    鍵3(名稱3) : {值1, 值3, 值4}
    鍵4(名稱4) : {值2, 值5, 值6}
    鍵5(名稱5) : {值1, 值7}
    }
for name, contents in 字典名稱.items(): 
if contents & {'值2', '值7'}: 
print(name)
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> for name, contents in drinks.items():
    if contents & {'vermouth', 'orange juice'}:
        print(name)


martini
manhattan
screwdriver
  1. 變數1 = 字典名稱1['鍵1']
  2. 變數2 = 字典名稱2['鍵2']
  3. 變數1 & 變數2
  4. {'值1', '值3'}
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss & wruss
{'vodka', 'kahlua'}
  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 & 集合名稱2
  4. 值2
>>> a = {1, 2}
>>> b = {2, 3}

>>> a & b
{2}

方法二:【使用 intersection() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.intersection(集合名稱2)
  4. 值2
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.intersection(b)
{2}

將「集合」存在「變數」內,節省打字次數

  • 字典 = {
    鍵1(名稱1) : {值1, 值2},
    鍵2(名稱2) : {值1, 值3},
    鍵3(名稱3) : {值1, 值3, 值4}
    鍵4(名稱4) : {值2, 值5, 值6}
    鍵5(名稱5) : {值1, 值7}
    }
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

值1:vodka 值2:vermouth 值3:kahlua 值4:cream 值5:rye 值6:bitters 值7:orange juice

  • 將兩種的材料「集合」存在「變數」內,節省之後範例的打字次數
    變數1 = 字典['鍵1']
    變數2 = 字典['鍵2']
>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

聯集【使用 | 或 union()】

方法一:【使用 | 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 | 集合名稱2
  4. {值1, 值2, 值3}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a | b
{1, 2, 3}
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss | wruss
{'vodka', 'cream', 'kahlua'}

方法二:【使用 union() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.union(集合名稱2)
  4. {值1, 值2, 值3}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.union(b)
{1, 2, 3}

差集【使用 - 或 difference()】

取得方式:屬於第一個集合,但不屬於第二個集合的成員

方法一:【使用 - 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 - 集合名稱2
  4. {值1}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a - b
{1}
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss - wruss
set()

>>> wruss - bruss
{'cream'}
>>>

方法二:【使用 difference() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.difference(集合名稱2)
  4. {值1}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.difference(b)
{1}

以上,是最常見的集合運算子

  • 到目前為止,最常見的集合運算子是「聯集」、「交集」、「差集」。
  • 為了完整起見,接下來會討論其他的集合運算子,但可能永遠都不會用到它們

互斥【使用 ^ 或 symmetric_difference()】

互斥或只屬於其中一個集合的項目

方法一:【使用 ^ 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 ^ 集合名稱2
  4. {值1, 值3}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a ^ b
{1, 3}
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss ^ wruss
{'cream'}

方法二:【使用 symmetric_difference() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.symmetric_difference(集合名稱2)
  4. {值1, 值3}
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.symmetric_difference(b)
{1, 3}

子集合【使用 <= 或 issubset()】

可以用 <= 或 issubset() 來檢查「某個集合」是否為「另一個集合」的子集合(第一個集合的「所有成員」都屬於第二個集合)

方法一:【使用 <= 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 <= 集合名稱2
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a <= b
False
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss <= wruss
True

方法二:【使用 issubset() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.issubset(集合名稱2)
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.issubset(b)
False

方法三:子集合 —「所有的集合」都是「它自己」的子集合

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱1 <= 集合名稱1
  3. 集合名稱1.issubset(集合名稱1)
  4. True
>>> a = {1, 2}
>>> b = {2, 3}

>>> a <= a
True

>>> a.issubset(a)
True

真子集(proper subset)【使用 < 】

要讓真子集(proper subset)成立,「第二個集合」必須擁有「第一個集合」的所有成員此外還要有其他的成員

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 < 集合名稱2
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a < b
False
>>> a < a
False
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> bruss < wruss
True

超集合(superset)【使用 >= 或 issuperset()】

  • 超集合(superset)是子集合的相反
  • 「第二個集合」的所有成員都是「第一個集合」的成員

方法一:【使用 >= 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 >= 集合名稱2
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a >= b
False
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> wruss >= bruss
True

方法二:【使用 issuperset() 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1.issuperset(集合名稱2)
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a.issuperset(b)
False

方法三:超集合 —「所有的集合」都是「它自己」的超集合

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱1 = {值1, 值2}
  3. 集合名稱1 >= 集合名稱1
  4. 集合名稱1.issuperset(集合名稱1)
  5. True
>>> a = {1, 2}
>>> b = {2, 3}

>>> a >= a
True
>>> a.issuperset(a)
True

真超集合【使用 > 】

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱2 = {值3, 值2}
  3. 集合名稱1 > 集合名稱2
  4. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a > b
False
>>> drinks = {
    'martini': {'vodka', 'vermouth'},
    'black russian': {'vodka', 'kahlua'},
    'white russian': {'vodka', 'kahlua', 'cream'},
    'manhattan': {'vermouth', 'rye', 'bitters'},
    'screwdriver': {'vodka', 'orange juice'}
}

>>> bruss = drinks['black russian']
>>> wruss = drinks['white russian']

>>> wruss > bruss
True

集合無法成為自己的真超集合

  1. 集合名稱1 = {值1, 值2}
  2. 集合名稱1 > 集合名稱1
  3. False
>>> a = {1, 2}
>>> b = {2, 3}

>>> a > a
False

results matching ""

    No results matching ""