2014-12-10 79 views
0

我知道這已被問過,但我一直無法找到解決方案。Python:自定義排序列表

我試圖根據自定義字母表將列表的列表按字母順序排列。

該字母表是Burmese script的一種表示形式,由Sgaw Karen以純ASCII使用。緬甸語字母是一個字母音節 - 幾十個發音,一些中音符號和幾十個押韻,可以以幾千種不同的方式組合,每一種都是代表一個音節的單個「字符」。 map.txt文件包含以(Karen/Burmese)字母順序列出的這些音節,但以某種未知方式轉換爲ASCII符號,因此第一個字符是u>m;.Rf而不是က[ka̰]。例如:

u>m;.Rf ug>m;.Rf uH>m;.Rf uX>m;.Rf uk>m;.Rf ul>m;.Rf uh>m;.Rf uJ>m;.Rf ud>m;.Rf uD>m;.Rf u->m;.Rf uj>m;.Rf us>m;.Rf uV>m;.Rf uG>m;.Rf uU>m;.Rf uS>m;.Rf u+>m;.Rf uO>m;.Rf uF>m;.Rf 
c>m;.Rf cg>m;.Rf cH>m;.Rf cX>m;.Rf ck>m;.Rf cl>m;.Rf ch>m;.Rf cJ>m;.Rf cd>m;.Rf cD>m;.Rf c->m;.Rf cj>m;.Rf cs>m;.Rf cV>m;.Rf cG>m;.Rf cU>m;.Rf cS>m;.Rf c+>m;.Rf cO>m;.Rf cF>m;.Rf 

在列表的列表中的每個列表具有作爲其第一元件,斯高卡倫的字轉換成ASCII碼的符號以相同的方式。例如:

[['u&X>', 'n', 'yard'], ['vk.', 'n', 'yarn'], ['w>ouDxD.', 'n', 'yawn'], ['w>wuDxD.', 'n', 'yawn']] 

這是我到目前爲止有:

def alphabetize(word_list): 
    alphabet = ''.join([line.rstrip() for line in open('map.txt', 'rb')]) 
    word_list = sorted(word_list, key=lambda word: [alphabet.index(c) for c in word[0]]) 
    return word_list 

我想每個列表的第一個元素按字母順序排列word_list(如 'U & X>' ,'vk。'),根據alphabet中的模式。

我的代碼還沒有工作,我正在努力理解lambda和for循環的排序命令。

+0

是什麼模式呢? (在'map.txt'中)?這個文件是什麼樣的? – 2014-12-10 22:43:07

+0

它以何種方式未能正常工作? 「字母表」中有哪些內容,以及哪些值排序錯誤? – abarnert 2014-12-10 22:43:51

+0

此外,使用參數名'word'當參數將是詞的_list_似乎是一個非常令人困惑的事情,而可能是你在努力理解你的代碼的部分原因。它也可能有助於將'lambda'變成一個超行的'def',所以你可以用不同的值手動調用它,並且看看它返回的結果(只是你沒有把所有的東西都打包成一個巨大的表達式它在屏幕邊緣運行;您可以將listcomp擴展爲'for'循環,給出臨時名稱等,如果有幫助的話)。 – abarnert 2014-12-10 22:45:55

回答

0

首先,如果您嘗試查找alphabet中的整個word[0],而不是單個字符,則不應循環訪問word[0]的字符。直接使用alphabet.index(word[0])即可。

從您的意見,這聽起來像你想查找每個音譯緬腳本字符word[0]。這是不可能的,除非你可以寫一個算法來將單詞分解成這些字符。將它拆分爲音譯的ASCII字節根本無濟於事。


其次,您可能不應該在這裏使用index。當你認爲你需要使用index或類似的功能時,90%的時間,這意味着你使用錯誤的數據結構。你在這裏想要的是映射(大概是爲什麼叫做map.txt),就像一個字典,用單詞鍵入,而不是你必須明確搜索的單詞列表。然後,在那本詞典中查找一個詞是微不足道的。 (這是一大堆更高效,但事實上,它很容易閱讀和理解可能更爲重要。)


最後,我懷疑你的map.txt應該被理解爲一個空白 - 音譯字符的分隔列表,你想要找到的是任何給定單詞的列表索引。


所以,把他們放在一起,這樣的事情:

with open('map.txt', 'rb') as f: 
    mapping = {word: index for index, word in enumerate(f.read().split())} 
word_list = sorted(word_list, key=lambda word: mapping[word[0]]) 

但是,同樣的,這隻會爲一個音節詞的工作,因爲直到你能弄清楚如何要將單詞分成應該按字母順序排列的單位(在這種情況下是符號),則無法使其適用於多音節單詞。

一旦你已經寫了,做的代碼,我敢打賭,這將是非常容易的,只是一切都轉化爲緬甸腳本的適當的Unicode表示。每個音節在Unicode中仍然需要1-4個代碼點 - 但這很好,因爲標準的Unicode歸類算法(內置Python)已經知道如何爲該腳本正確地設置字母順序,所以您不必編寫它自己。或者,甚至更好,除非這是你或你的老師發明的一些奇怪的音譯,否則可能已經有在這種格式和Unicode之間轉換的代碼,這意味着你甚至不必自己寫任何東西。

+0

感謝您的評論。讓我試着更清楚一下map.txt文件是什麼。這不一定是一個單詞列表。白色空間是無關緊要的。它更像是一個很長的字符串,其功能與'abcdefghijklmnopqrstuvwxyz'的功能相同。定義以這種語言出現在別人之前的字符。 – denvaar 2014-12-10 23:15:46

+0

@DenverSmith:那麼通過「角色」你真的指的是角色 - 'u',然後'>',然後'm'等等。但是這些角色中的大多數都會一遍又一遍地出現,那麼「來之前」是什麼意思? – abarnert 2014-12-10 23:34:07

+0

@DenverSmith:如果你試圖從一個字母順序的單詞列表中推斷字符順序,那不起作用。例如,大多數Unix系統附帶的標準英文字典都以'aa aal aalii aam'開頭,所以它會告訴你'l'是字母表中的第二個字母,而'b'是第10個字母。 – abarnert 2014-12-10 23:36:23