Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Python中的自定义字母表对字符串值进行排序_Python_Sorting - Fatal编程技术网

根据Python中的自定义字母表对字符串值进行排序

根据Python中的自定义字母表对字符串值进行排序,python,sorting,Python,Sorting,我正在寻找一种根据自定义字母表对字符串列表进行排序的有效方法 例如,我有一个字符串字母表,它是“bafmxpzv”,还有一个仅由该字母表中包含的字符组成的字符串列表 我想用一种类似于其他常用排序的方式对列表进行排序,但使用这种自定义字母表。我该怎么做?更新,我误解了你的问题,你有一个字符串列表,而不是一个字符串,下面是如何做的,想法是一样的,使用基于自定义比较函数的排序: def acmp (a,b): la = len(a) lb = len(b) lm = min(la,lb) p

我正在寻找一种根据自定义字母表对字符串列表进行排序的有效方法

例如,我有一个字符串字母表,它是
“bafmxpzv”
,还有一个仅由该字母表中包含的字符组成的字符串列表


我想用一种类似于其他常用排序的方式对列表进行排序,但使用这种自定义字母表。我该怎么做?

更新,我误解了你的问题,你有一个字符串列表,而不是一个字符串,下面是如何做的,想法是一样的,使用基于自定义比较函数的排序:

def acmp (a,b):
 la = len(a)
 lb = len(b)
 lm = min(la,lb)
 p = 0
 while p < lm:
    pa = alphabet.index(a[p])
    pb = alphabet.index(b[p])
    if pa > pb:
        return 1
    if pb > pa:
        return -1
    p = p + 1

 if la > lb:
    return 1
 if lb > la:
    return -1
 return 0

mylist = ['baf', 'bam', 'pxm']
mylist.sort(cmp = acmp)
def acmp(a、b):
la=len(a)
lb=len(b)
lm=最小值(la,lb)
p=0
而ppb:
返回1
如果pb>pa:
返回-1
p=p+1
如果la>lb:
返回1
如果lb>la:
返回-1
返回0
mylist=['baf','bam','pxm']
mylist.sort(cmp=acmp)

让我们创建一个字母表和一个单词列表:

In [32]: alphabet = "bafmxpzv"

In [33]: a = ['af', 'ax', 'am', 'ab', 'zvpmf']
现在,让我们根据字母在字母表中的位置对它们进行排序:

In [34]: sorted(a, key=lambda word: [alphabet.index(c) for c in word])
Out[34]: ['ab', 'af', 'am', 'ax', 'zvpmf']
以上内容按正确顺序排序

sorted
支持多种自定义排序。
sorted
函数有三个可选参数:
cmp
key
reverse

  • cmp
    适用于复杂的排序任务。如果指定,
    cmp
    应该是一个接受两个参数的函数。它应该返回一个负数、零或正数,这取决于第一个参数是否被视为小于、等于或大于第二个参数。在这种情况下,
    cmp
    是过度杀伤力

  • ,如果指定,应该是一个函数,它接受一个参数并返回python本机知道如何排序的内容。在本例中,键返回字母表中每个单词字符的索引列表

    在这种情况下,
    返回字母表中字母的索引

  • 反向
    ,如果为真,则反向排序顺序

不起作用的替代品 评论中提到了这种替代形式:

In [35]: sorted(a, key=lambda word: [alphabet.index(c) for c in word[0]])
Out[35]: ['af', 'ax', 'am', 'ab', 'zvpmf']
请注意,这并没有按照正确的顺序排序。这是因为这里的
函数只考虑每个单词的第一个字母。这可以通过测试
键来证明:

In [2]: key=lambda word: [alphabet.index(c) for c in word[0]]

In [3]: key('af')
Out[3]: [1]

In [4]: key('ax')
Out[4]: [1]

请注意,
key
为两个不同的字符串返回相同的值,
af
ax
。返回的值仅反映每个单词的第一个字符。因此,
sorted
无法确定
af
属于
ax
之前

与其使用需要查找字符索引的
index()
,更好的替代方法是构建一个哈希映射以用于排序,以便直接检索索引。
例如:


如何在字符串上调用sort?哦,它没有sort,请使用sorted,谢谢更正。我重新考虑后编辑了答案,我想我没有理解他最初的问题。它是一个字符串列表,而不仅仅是一个字符串。我将发布另一个答案。可能是wow的副本,在链接的问题中,我发现这段代码我不太理解,但似乎很有效:new_list=sorted(inputList,key=lambda word:[alphabet.index(c)for c in word[0]]------为什么是word[0]????我不能清楚地理解这一点,只有“单词”应该是最好的解决办法!小更正:“在本例中,key返回字母表中字母的索引。”应该是:“在本例中,key返回一个列表,其中包含单词中每个字符的一个条目,反映了字符在字母表中的索引。”@Jpsy谢谢,我重新改写了那个句子!如何根据字符串中的子字符串进行排序?例如,如果
a=['01af','02ax','03am','04ab','05zvpmf']
,则列表仅按字母字符排序only@IMLD我不清楚您到底想要什么,但请尝试:
sorted(a,key=lambda word:[alphabet.index(c)for c in word if c.isalpha())
>>> alphabet = "bafmxpzv"
>>> a = ['af', 'ax', 'am', 'ab', 'zvpmf']
>>> order = dict(zip(alphabet, range(len(alphabet))))
>>> sorted(a, key=lambda word: [order[c] for c in word])
['ab', 'af', 'am', 'ax', 'zvpmf']