求該題目程式碼
高中職畢業生希望選擇心目中理想的大學。
假設每一大學可以用下列七種屬性表示:
BC(Big Campus):代表有大校園。
NC(Next to City):代表鄰近有大城市。
CT(Convenient Transportation):代表交通方便。
NS(Next to Sea):代表靠海。
NM(Next to Mountain):代表依山。
HL(Has Lake):代表校園有湖。
NL(Near Landscape):代表附近有風景區。
輸入說明:
1. 第一行輸入一個【正整數】,代表大學個數 n ,請注意 【n<=10 】。
2. 其後 n 行,每一行第一項為大學名稱,接著為大學具備的屬性。
一個大學名稱【最多有 10 個字母】,【各項屬性為 2 個字母】。大學與屬性資料【均為英文字母】,
大學名稱及各屬性間以【一個空白】分隔。
3. 接下來的一行輸入一個查詢
查詢條件為校園屬性組成,每個校園屬性為【2個字元】,
此外,用 + 號區隔的條件代表 "或" 的關係,用空白區隔的條件代表 "且" 的關係,用 ! 號連接屬性代表 “不” 的關係。
屬性之間以及和 + 之間有一空白間隔( ! 號與屬性之間沒有空白間隔)。
以 + 號區隔不同的子條件。
其格式如下:
BC NS + CT HL + NL !NM
意思為屬性條件為: 三種子條件,BC 且 NS ,或是 CT 且 HL ,或是 NL 且不要 NM。
代表需找出有大校園且靠海,或 交通方便且校園有湖的所有大學名稱,或 附近有風景區且不要依山。
輸出說明:
所有符合之大學名稱與符合子條件個數(比如: NTUT,3)。
若有多個大學符合一個查詢,各大學間以一個空白分隔。
每行查詢的輸出順序,請根據大學符合的子條件個數進行排序,
若條件個數相同,則根據輸入大學的順序來排序。
Sample Input:
2 # 兩間學校
A BC NC CT NS NM HL # A學校 符合BC、NC、CT、NS、NM、HL
B CT NS NM # B學校 符合CT、NS、NM
CT NS + !NL + NM HL # 三種子條件,CT 且 NS 或 不NL 或 NM且HL
Sample Output:
A,3 B,2 # A學校三種子條件皆符合,B學校僅符合CT NS、!NL 兩種子條件
--------------------------------------------------------------------
Sample Input:
2
A BC NC CT NS NM HL
B CT NS NM
CT + HL + !BC
Sample Output:
A,2 B,2
d = {'BC': ['Big Campus', '有大校園'],
'NC': ['Next to City', '鄰近有大城市'],
'CT': ['Convenient Transportation', '交通方便'],
'NS': ['Next to Sea', '靠海'],
'NM': ['Next to Mountain', '依山'],
'HL': ['Has Lake', '有湖'],
'NL': ['Near Landscape', '附近有風景區'], }
def SELECT(dictC, con):
dicNames = {}
for k, v in dictC.items():
if isinstance(con, list): # 是并且
if set(v).issuperset(set(con)):
dicNames[k] = dicNames.get(k, 0) + 1
elif isinstance(con, str): # 是单个条件或非条件
if con[0] == '!':
if con[1:] not in v:
dicNames[k] = dicNames.get(k, 0) + 1
else:
if con in v:
dicNames[k] = dicNames.get(k, 0) + 1
return dicNames
def UpdateDict(dic1, dic2):
for k, v in dic2.items():
x = dic1.get(k, 0)
if x == 0:
dic1[k] = v
else:
dic1[k] += v
return dic1
n = int(input("输入学校个数:"))
d1 = {}
for _ in range(n):
S = input("输入学校名称及属性:").split()
d1[S[0]] = S[1:]
dicRes = {} # 储存结果
condition = input("输入查询条件:")
cods = list(map(lambda x: x.strip(), condition.split("+")))
for cod in cods:
if ' ' in cod:
c = cod.split()
else:
c = cod
dR = SELECT(d1, c)
UpdateDict(dicRes, dR)
for k, v in dicRes.items():
print(f"{k},{v} ", end = ' ')
'''--result
输入学校个数:2
输入学校名称及属性:A BC NC CT NS NM HL
输入学校名称及属性:B CT NS NM
输入查询条件:CT NS + !NL + NM HL
A,3 B,2
'''
其实,你的思路蛮清晰了,你还有什么疑问?
这位朋友你是来自台湾的朋友吗
3楼回答了,没毛病。
基本就那样