Python-設計大學條件


求該題目程式碼



高中職畢業生希望選擇心目中理想的大學。

假設每一大學可以用下列七種屬性表示:

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楼回答了,没毛病。

基本就那样