bol_in 2021-12-28 04:06 采纳率: 64.6%
浏览 94
已结题

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


  • 写回答

5条回答 默认 最新

  • chuifengde 2021-12-28 10:24
    关注
    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  
    '''
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月29日
  • 已采纳回答 12月29日
  • 创建了问题 12月28日

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大