2014-12-10 102 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