# 3111. 文字搜索-長恨歌V 出現的句子排序 III ## 通靈一下 1. 首先題目要你造出沒有標點符號的長恨歌,可以用一堆string的replace來做,不要直接把題目給的list串起來,他串起來不是長恨歌 2. 排序順序是:字串長度(少到多)、出現頻率(多到少)、字串unicode(小到大),題目說依照第一個字的unicode,但沒說第一個字一樣的話就繼續比下去,所以其實是比整個字串啦 ## 方法 把題目給的字詞存起來,取名`word` 造出一個長恨歌,大概這樣: ```python song = "漢皇重色..." song.replace(" ", "") song.replace(",", "") ... ``` 再來我們要造出一個頻率表,他會是一個字典,裡面有題目給我們的字詞們,每個字詞對應一個數字(代表頻率),這裡用comprehension最快 ```python count = {word: 0 for word in words} ``` 造出來後,直接用string的count來算每個字詞各別有幾個,count的範例如下: ```python # example s = "fuck fuck damn fucking" s.count("fuck") 輸出: 3 # for 長恨歌 for word in words: count[word] = song.count(word) ``` 到這裡題目已經完成一半了,現在我們要過濾輸出,若題目要求字數是 1~2個字的詞,出現頻率為 5~6之間的字: ```python output = [] # 先有一個陣列,儲存過濾後的字詞 for word, val in count.items(): l = len(word) # 拿字詞的長度 if (l >= n1 and l <= n2) and (val >= m1 and val <= m2): # 過濾 output.append([word, val]) # 加到輸出陣列 ``` 接下來是這題重點,我們要來排序輸出,直接call sort,並且設定排序的優先序,sort有一個參數叫做`key`,可以設置客製化的優先序,這裡示範一個簡單的範例 ### sort範例 有一個2D陣列`[[1, 2], [3, 4], [1, 3], [3, 2]]`,裡面各別都是一個數字pair,我想要用裡面兩個數字加起來並且由小到大sort ```python l = [[1, 2], [3, 4], [1, 3], [3, 2]] l.sort(key=lambda pair: (pair[0] + pair[1])) 輸出: [[1, 2], [1, 3], [3, 2], [3, 4]] ``` `lambda pair`在這裡的意思是把`l`裡面的東西個別拿出來,並且稱作`pair`,然後造出一個有pair[0], pair[1]的tuple,並且將其對應到原本的pair(可以想成替身) 所以現在`l`其實會變成: ```python l = [ [1, 2], 替身:(3) [3, 4], 替身:(7) [1, 3], 替身:(4) [3, 2], 替身:(5) ] ``` 造出替身後,python就會很聰明的用他的替身來sort了 替身不一定只有一個優先序,我也可以說,我的優先序是先兩數和,若是兩數和一樣的話,再看第一個數字: ```python l.sort(key=lambda pair: (pair[0] + pair[1], pair[0])) ``` 所以替身的general寫法就是:(優先序1, 優先序2, ...),也不一定要用tuple,[優先序1, 優先序2, ...]也可以 ## 回到題目 所以優先序序是:字串長度(少到多)、出現頻率(多到少)、字串unicode(小到大)的話就可以這樣寫: ```python output.sort(key=lambda pair: (len(pair[0]), -pair[1], pair[0])) ``` 其中`len(pair[0])`就是字串長度;`pair[1]`為出現頻率,但因為我們要由多到少排,所以乘-1(仔細想想為什麼可以這樣寫);最後都一樣的話比整個字串,也就是`x[0]`,python在排序字串的時候預設就是用unicode排序,所以替身就直接是字串本身即可 最後就輸出即可 ```python for pair in output: print(pair[0], pair[1]) ``` ## Code ```python= words = ['漢皇', '重色思', '傾國', '御宇', '多年', '求', '不得', '楊家', '有', '女', '初長', '成養', '在', '深閏人', '未識', '天生', '麗質', '難', '自棄', '一朝', '選在', '君王', '側', '回眸', '回眸一笑', '百媚生', '六宮', '粉黛', '無顏色', '春寒', '賜', '浴華清', '池溫', '泉水', '滑洗', '凝脂', '侍兒', '扶', '起嬌', '無力始', '是', '新承恩澤時', '雲鬢花', '顏金步搖', '芙蓉', '帳暖', '春宵', '度春宵', '春宵', '苦短', '春宵苦短', '日高起', '從', '此', '君王', '不早', '朝承歡', '侍宴', '無', '閑', '暇', '春', '從', '春遊夜', '專夜', '後', '宮佳麗', '三千', '人', '三千', '寵愛在', '一身', '金屋', '妝', '成嬌', '侍夜', '玉樓', '宴', '罷醉', '和', '春', '姊妹', '弟兄', '皆', '列士', '可憐', '光彩', '生門戶', '遂', '令', '天下', '父母', '天下父母', '心', '不', '重生', '男', '重生', '女驪宮', '高處入', '青雲仙樂', '風飄處', '處聞', '緩歌', '慢舞', '凝絲竹', '盡日', '君王', '看', '不足', '漁陽', '鼙', '鼓動', '地來', '驚破', '霓裳', '羽衣', '羽衣曲', '九重', '城闕', '煙塵', '生千乘', '萬', '騎', '西南', '行翠華搖搖行', '復', '止', '西出', '都', '門百餘里', '六軍不發', '無', '奈何', '宛轉', '蛾眉', '馬', '前', '死', '花鈿委地', '無人', '收翠翹', '金雀玉', '搔頭', '君王', '掩面', '救', '不得', '回看', '血淚', '相', '和', '流黃埃', '散漫', '風蕭索', '雲棧', '縈', '紆', '登劍閣', '峨嵋', '峨嵋山', '下少', '人行', '旌旗', '無光', '日色', '薄', '蜀', '江水', '碧', '蜀山', '青聖主', '朝暮', '朝朝暮暮', '情行', '宮見', '月', '傷心色', '夜雨', '聞鈴腸', '斷聲', '天旋', '地轉', '迴', '龍馭', '到', '此', '躊躇', '不能', '去', '馬', '嵬', '坡', '下', '泥土', '中不見', '玉顏空', '死', '處', '君臣', '相顧', '盡霑', '衣東望', '都', '門信', '馬', '歸歸來', '池苑', '皆', '依舊', '太液', '芙蓉', '未央', '柳', '芙蓉', '如面', '柳如眉', '對此', '如何', '不淚', '垂春風', '桃李', '花開', '日', '秋雨', '梧桐', '葉落', '時西宮', '南內', '多秋草', '落葉', '滿階紅', '不', '掃梨園', '子弟', '白', '髮', '新椒房', '阿監', '青娥', '老夕殿', '螢飛思', '悄然', '孤燈', '挑', '盡', '未', '成眠', '遲遲', '鐘鼓', '初長', '夜', '耿耿', '星河', '耿耿星河', '欲曙天', '鴛鴦', '瓦', '冷霜', '華重', '翡翠', '衾', '寒', '誰', '與', '共', '悠悠', '生死', '別經', '年', '魂魄', '不曾', '來入', '夢臨', '邛', '道士', '鴻', '都', '客能', '以', '精誠致', '魂魄', '為感', '君王', '輾轉思', '遂', '教', '方士', '殷勤', '覓', '排空', '馭', '氣奔', '如電', '升天', '入', '地求', '之遍', '上', '窮', '碧', '落下', '黃', '泉', '兩處', '茫茫', '皆', '不見', '忽聞', '海上', '有', '仙山', '山在', '虛無縹緲', '間', '樓', '閣玲瓏', '五雲起', '其中', '綽約', '多', '仙子', '中有', '人字', '一人字', '太', '真雪膚', '花貌', '參差', '是', '金', '闕', '西廂', '叩玉', '扃', '轉教', '小玉報', '雙成', '聞道', '漢家', '天子', '使九華', '帳裡', '夢魂', '推枕起', '徘徊', '珠箔', '銀屏', '迤邐', '開雲鬢', '半偏', '新', '睡覺', '花冠', '不整', '下堂', '來風', '吹', '仙袂', '飄飄舉', '猶似', '霓裳', '羽衣', '舞', '玉容', '寂寞', '淚闌干', '梨花', '一枝', '一枝春', '帶雨', '含情', '凝睇', '謝', '君王', '一別', '音容', '兩', '渺茫', '昭陽', '殿裡', '恩愛絕', '蓬萊宮', '中', '日月', '長', '回頭', '下望', '人', '寰', '處', '不見長', '安見', '塵霧', '唯將', '舊物表', '深情', '鈿', '合金', '釵', '寄將', '去', '釵', '留', '一股', '合', '一扇', '釵', '擘', '黃', '金合', '分鈿', '但', '教心', '似金鈿堅', '天上', '人間', '會', '相見', '臨別', '殷勤', '重寄詞', '詞中', '有', '誓', '心知', '兩心知', '七月', '七日', '七月七日', '長', '生殿', '夜半', '無人', '私語', '時', '在', '天願作', '比翼', '比翼鳥', '在', '地願', '為', '連理枝', '天長', '地久', '有', '時', '盡', '此恨', '綿綿', '無', '絕期'] song="漢皇重色思傾國御宇多年求不得楊家有女初長成養在深閏人未識天生麗質難自棄一朝選在君王側回眸一笑百媚生六宮粉黛無顏色春寒賜浴華清池溫泉水滑洗凝脂侍兒扶起嬌無力始是新承恩澤時雲鬢花顏金步搖芙蓉帳暖度春宵春宵苦短日高起從此君王不早朝承歡侍宴無閑暇春從春遊夜專夜後宮佳麗三千人三千寵愛在一身金屋妝成嬌侍夜玉樓宴罷醉和春姊妹弟兄皆列士可憐光彩生門戶遂令天下父母心不重生男重生女驪宮高處入青雲仙樂風飄處處聞緩歌慢舞凝絲竹盡日君王看不足漁陽鼙鼓動地來驚破霓裳羽衣曲九重城闕煙塵生千乘萬騎西南行翠華搖搖行復止西出都門百餘里六軍不發無奈何宛轉蛾眉馬前死花鈿委地無人收翠翹金雀玉搔頭君王掩面救不得回看血淚相和流黃埃散漫風蕭索雲棧縈紆登劍閣峨嵋山下少人行旌旗無光日色薄蜀江水碧蜀山青聖主朝朝暮暮情行宮見月傷心色夜雨聞鈴腸斷聲天旋地轉迴龍馭到此躊躇不能去馬嵬坡下泥土中不見玉顏空死處君臣相顧盡霑衣東望都門信馬歸歸來池苑皆依舊太液芙蓉未央柳芙蓉如面柳如眉對此如何不淚垂春風桃李花開日秋雨梧桐葉落時西宮南內多秋草落葉滿階紅不掃梨園子弟白髮新椒房阿監青娥老夕殿螢飛思悄然孤燈挑盡未成眠遲遲鐘鼓初長夜耿耿星河欲曙天鴛鴦瓦冷霜華重翡翠衾寒誰與共悠悠生死別經年魂魄不曾來入夢臨邛道士鴻都客能以精誠致魂魄為感君王輾轉思遂教方士殷勤覓排空馭氣奔如電升天入地求之遍上窮碧落下黃泉兩處茫茫皆不見忽聞海上有仙山山在虛無縹緲間樓閣玲瓏五雲起其中綽約多仙子中有一人字太真雪膚花貌參差是金闕西廂叩玉扃轉教小玉報雙成聞道漢家天子使九華帳裡夢魂驚攬衣推枕起徘徊珠箔銀屏迤邐開雲鬢半偏新睡覺花冠不整下堂來風吹仙袂飄飄舉猶似霓裳羽衣舞玉容寂寞淚闌干梨花一枝春帶雨含情凝睇謝君王一別音容兩渺茫昭陽殿裡恩愛絕蓬萊宮中日月長回頭下望人寰處不見長安見塵霧唯將舊物表深情鈿合金釵寄將去釵留一股合一扇釵擘黃金合分鈿但教心似金鈿堅天上人間會相見臨別殷勤重寄詞詞中有誓兩心知七月七日長生殿夜半無人私語時:在天願作比翼鳥在地願為連理枝天長地久有時盡此恨綿綿無絕期" count = {word: 0 for word in words} for word in words: count[word] = song.count(word) n1, n2, m1, m2 = int(input()), int(input()), int(input()), int(input()) output = [] for word, val in count.items(): l = len(word) if (l >= n1 and l <= n2) and (val >= m1 and val <= m2): output.append([word, val]) output.sort(key=lambda pair: (len(pair[0]), -pair[1], pair[0])) for pair in output: print(pair[0], pair[1]) ``` ```