python 如何从自定义字母表中按字母顺序对单词列表进行排序?

mkh04yzy  于 2023-11-15  发布在  Python
关注(0)|答案(3)|浏览(114)

我正在尝试创建一种语言,并对其中的单词进行自动排序,我正在为它编写一个python脚本,因为我不能让事情变得简单。我需要用字母表:"æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz"进行排序。
我在this post中尝试了最佳答案

def sortA(l, alphabet="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"):
    returnVal = sorted(l, key=lambda word: [alphabet.index(c) for c in word])
    return returnVal

keys = sortA(keys, "æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz")

字符串
VSC表示,

Exception has occurred: ValueError
substring not found
  File "filepath", line 13, in <lambda>
    returnVal = sorted(l, key=lambda word: [alphabet.index(c) for c in word])
                                            ^^^^^^^^^^^^^^^^^

编辑

问题可能是某些字符的编码问题。

编辑2

我相信问题是从这里开始的:

def newEntry():
    word = input("What is the word?: \n")
    defin = input("What is the definition of the word?: \n")
    etymology = input("Where does the word come from?:\n")
    detail = [defin, etymology]
    return {word: detail}

def entryToDict(e):
    spl = str(e).split("\n")
    return [spl[0], [spl[1],spl[2]]]


Read = (f.read()).split("\n\n")
dic = newEntry()
for i in Read:
    entry = entryToDict(i)
    dic[entry[0]] = entry[1]
keys = list(dic.keys())
f.close()

liwlm1x9

liwlm1x91#

你得到这个错误,因为你有一个字符在keys中,而不是在alphabet中。
您可以更改sortA来处理此类情况,而不是抛出错误:

def sortA(l, alphabet="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"):
    def get_value(char):
        if char in alphabet:
            return alphabet.index(char)
        else:
            return len(alphabet)
    returnVal = sorted(l, key=lambda word: [get_value(c) for c in word])
    return returnVal

字符串
当然,你可以打印keys,看看它的值是否不是它应该是的。

编辑:

如果我使用你在注解中给出的列表,并更改sortA函数来打印所有不在你的alphabet中的字符,就像这样:

def sortA(l, alphabet="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"):
    def get_value(char):
        if char in alphabet:
            return alphabet.index(char)
        else:
            print("Character not in alphabet:", char)
            return len(alphabet)
    returnVal = sorted(l, key=lambda word: [get_value(c) for c in word])
    return returnVal

keys =  ['æovʌn', 'ɯaʃoid', 'dfsʃia']
keys = sortA(keys, "æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz")

print(keys)


我得到:

Character not in alphabet: É
Character not in alphabet: ¯
Character not in alphabet: Ê
Character not in alphabet: ƒ
Character not in alphabet: Ê
Character not in alphabet: ƒ
['æovʌn', 'dfsʃia', 'ɯaʃoid']


这可以让您给予一个概念,即您在定制的alphabet中遗漏了哪些字符。

xxb16uws

xxb16uws2#

问题不在提供的代码中。这是阅读文本文件的问题。Actual Problem

t3psigkw

t3psigkw3#

另一种方法是开发要使用的排序规则。如果您在使用gLibC的系统上,则可以使用排序规则创建自定义区域设置。或者,如果ICU4C在您的平台上可用,则可以使用PyICU:
以下规则是基于OP和评论的粗略草案:

[strength 2]
&[before 1]a<æ
&d<y
&i<ʒ
&n<ŋ<Ω
&o<ø<ɤ
&r<ʃ
&s<þ<ð<t<ʊ
&u<ʌ
&v<ɯ<j

字符串
然后在字母表中创建一个随机的字母列表:

import random
alphabet = "æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz"
random_alphabet = random.sample(alphabet,len(alphabet))
print(random_alphabet)
# ['ʌ', 'l', 'Ω', 'k', 'd', 'é', 'ð', 'e', 'þ', 'i', 'n', 'm', 'ǽ', 'ʃ', 'í', 'ʒ', 'f', 't', 'z', 'ú', 'p', 'ɤ', 'g', 'y', 'ŋ', 's', 'ǿ', 'Ώ', 'j', 'æ', 'o', 'b', 'v', 'ʊ', 'à', 'ý', 'u', 'a', 'ø', 'ɯ', 'ó', 'r']


创建一个排序器示例:

import icu
rules = "[strength 2]&[before 1]a<æ&d<y&i<ʒ&n<ŋ<Ω&o<ø<ɤ&r<ʃ&s<þ<ð<t<ʊ&u<ʌ&v<ɯ<j"
collator = icu.RuleBasedCollator(rules)


然后对列表进行排序:

sorted_alphabet = sorted(random_alphabet, key=collator.getSortKey)
alphabet == "".join(sorted_alphabet)
# True
print("".join(sorted_alphabet))
# æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz

编辑:

OP中的排序例程和本答案中的排序例程在字母表中的字符权重方面存在关键差异。OP的代码赋予字母表中的所有字母相同的权重,就排序而言,这意味着每个字母都有主要的强度。在我的答案中,带有变音符号的字母被赋予二级强度。这将导致与OP中定义的函数产生的排序顺序不同的排序顺序:

def sortA(l, alphabet="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"):
    returnVal = sorted(l, key=lambda word: [alphabet.index(c) for c in word])
    return returnVal
data = ["ba", "àt", "az"]
sortA(data, "æǽaàbdyýeéfgiíʒklmnŋΩΏoóøǿɤprʃsþðtʊuúʌvɯjz")
# ['az', 'àt', 'ba']


使用上面定义的collator:

sorted(data, key=collator.getSortKey)
# ['àt', 'az', 'ba']

相关问题