# 6. 課程分組,分為X與Y兩組,輸入X和Y兩組需要學習的科目到集合中,以字串”end”作為結束,請依序分行顯示
# (1) X組和Y組所有的科目
# (2) X組和 Y組共同科目
# (3) Y組有但是X組沒有的科目
# (4) X有Y沒有以及Y有X沒有的科目
# (5) X組: 國文、英文、數學乙、地理、歷史。 Y組:國文、數學甲、英文、物理、化學
題目是模擬「課程分組」,X 組和 Y 組各有一些要學的科目,
請你輸入兩組的科目資料(用集合 set 儲存),然後分別輸出他們之間的課程關係。
輸入 X 組與 Y 組的學習科目
用字串 "end" 當作輸入結束的指令(和前幾題一樣)
👉 所以你會要使用 input() 一直輸入科目名稱,直到使用者輸入 end。
接下來根據輸入的 X 組與 Y 組的資料,分別顯示以下幾種集合運算的結果(共五項):
這是在問:兩組所有學過的科目 → 就是聯集
📚 意思是:X 有、Y 有,都放進來,一份不重複的清單
這是在問:X 與 Y 都有學的科目 → 就是交集
📚 兩邊都出現的科目才要顯示
這是在問:只在 Y 出現、X 沒有的 → 就是差集(Y - X)
📚 Y 的獨家課程,X 沒有學的
這是在問:X、Y 各自「獨有」的科目 → 就是對稱差集(X ⊕ Y)
📚 只在其中一邊出現的,雙方不重疊的
X組:國文、英文、數學乙、地理、歷史。
Y組:國文、數學甲、英文、物理、化學
這是要你測試前面 4 項功能是否正確,可以先手動輸入這些資料來驗證程式。
學會集合的運算:聯集、交集、差集、對稱差集
學會根據題意選對集合方法
學會將結果分行列出、排版清楚
老師出要我用(5)的資料做聯集、交集、跟差集、跟對稱差。(老師國文有問題)
用第 (5) 題提供的資料,去計算前面 (1)~(4) 的集合關係
X組科目 = {"國文", "英文", "數學乙", "地理", "歷史"}
Y組科目 = {"國文", "數學甲", "英文", "物理", "化學"}
然後依題目要求:
項次 集合運算 解釋 範例運算
(1) 聯集 X 和 Y 的所有科目(不重複) `X
(2) 交集 兩組都有的科目 X & Y 或 X.intersection(Y)
(3) 差集 Y 有但 X 沒有的科目 Y - X 或 Y.difference(X)
(4) 對稱差集 兩邊不一樣的科目 X ^ Y 或 X.symmetric_difference(Y)
這樣在寫程式時,只要把這 2 組資料放進集合中, 再依照集合運算去算出每個結果,然後一個一個 print() 出來就可以了。
setx=set()
sety=set()
ans=set()
def keyint(seta,i):
print(f"請輸入{i}組的學習課目,輸入end為結束")
while True:
k=input("請輸入科目=>")
if k=='end':
break
seta.add(k)
print('請輸入X組')
keyint(setx,'X')
print('\n請輸入Y組')
keyint(sety,'Y')
ans=setx.union(sety)
print(f"聯集為{ans}\n")
ans=setx.intersection(sety)
print(f"交集為{ans}\n")
ans=setx.difference(sety)
print(f'差集為 {ans}\n')
ans=setx.symmetric_difference(sety)
print(f'對稱差為 {ans}')
聯集為 {'國文', '英文', '數學乙', '數學甲', '物理', '地理', '化學', '歷史'}
交集為 {'國文', '英文'}
差集為 {'地理', '數學乙', '歷史'}
對稱差為 {'數學乙', '數學甲', '地理', '化學', '物理', '歷史'}