我知道以前曾经问过,但我找不到解决办法。
我正在尝试根据自定义字母表按字母顺序排列列表。
字母表是Burmese script在纯ASCII中Sgaw Karen使用的表示形式。缅甸文字是一个字母表 - 几十个插图,一些内侧变音符号和几十个押韵,可以用数千种不同的方式组合,每一种都是代表一个音节的单个“字符”。 map.txt
文件具有这些音节,以(Karen / Burmese)字母顺序列出,但以某种未知方式转换为ASCII符号,因此第一个字符为u>m;.Rf
而不是က
或{ {1}}。例如:
[ka̰]
列表列表中的每个列表都以相同的方式将Sgaw Karen的单词转换为ASCII符号作为其第一个元素。例如:
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
这是我到目前为止所做的:
[['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
中的模式,按每个列表的第一个元素(例如'u& X>','vk。')按字母顺序排列word_list
。
我的代码还没有工作,我很难理解lambda和for循环的排序命令。
答案 0 :(得分:0)
首先,如果您尝试查找word[0]
中的整个alphabet
,而不是单独查找每个字符,则不应该遍历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之间进行转换,这意味着您甚至不必自己编写任何内容。