Python:自定义对列表进行排序

2024-05-01 21:55:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道以前有人问过这个问题,但我一直没能找到解决办法。在

我试着根据一个自定义的字母表来排列列表的字母。在

字母表是Burmese script的表示,如{a2}在纯ASCII中使用的那样。缅甸文字是一个字母音节——几十个词尾、几个中间变音符号和几十个可以以数千种不同方式组合的押韵,每一个都是代表一个音节的单个“字符”。map.txt文件有这些音节,按(克伦语/缅甸语)字母顺序列出,但以某种未知方式转换为ASCII符号,因此第一个字符是u>m;.Rf,而不是က或{}。例如:

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

列表列表中的每个列表都有一个Sgaw Karen单词作为其第一个元素,并以相同的方式转换成ASCII符号。例如:

^{pr2}$

到目前为止,我得到的是:

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

我想根据alphabet中的模式,按每个列表的第一个元素(例如“u&;X>;”、“vk.”)按字母顺序排列{}。在

我的代码还没有运行,我正在努力理解lambda和for循环的排序命令。在


Tags: txtmap列表for字母方式ascii符号
1条回答
网友
1楼 · 发布于 2024-05-01 21:55:07

首先,如果您试图在alphabet中查找整个word[0],而不是逐个查找每个字符,那么不应该在{}的字符上循环。直接使用alphabet.index(word[0])。在

从你的评论来看,听起来你好像在查找word[0]中的每一个缅甸文音译字符。这是不可能的,除非你能写一个算法把一个词分成这些字符。把它拆分成音译的ASCII字节一点帮助也没有。在


其次,您可能不应该在这里使用index。当您认为需要使用index或类似函数时,90%的情况下,这意味着您使用了错误的数据结构。这里您需要的是一个映射(大概是为什么它被称为map.txt),就像一个由单词键控的dict,而不是一个必须一直显式搜索的单词列表。那么,在那本字典里查一个词是微不足道的。(它的效率更高,但它的易读性和易懂性更为重要。)


最后,我怀疑您的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个代码点,但这没问题,因为Python内置的标准Unicode排序算法已经知道如何为该脚本正确地按字母顺序排列,所以您不必自己编写。在

或者,更好的是,除非这是你或你的老师发明的一些奇怪的音译,否则可能已经有代码可以在这种格式和Unicode之间进行转换,这意味着你甚至不必自己编写任何东西。在

相关问题 更多 >