如何在python中使用键对列表进行排序

2024-06-28 14:50:30 发布

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

我有一个单词列表:

words = ['miel', 'extraterrestre', 'al', 'automovil', 'auto', 'revestir']

我想使用自定义字母表对该列表进行排序(它包含字母表中的26个字母,但排序方式不同):

g = 'zyxwvutsrqponmlkjihgfedcba'

预期结果:

['revestir', 'miel', 'extraterrestre', 'auto', 'automovil', 'al']

Tags: 列表auto排序字母方式单词字母表words
3条回答

更有效的解决方案不是为每个字母建立索引,而是事先建立一个字典,并为单词中的每个字母使用get函数

pos_map = {}
for idx, letter in enumerate(g):
    pos_map[letter] = idx

def key(item):
    return [pos_map.get(c) for c in item]

sorted(words, key=key)
['revestir', 'miel', 'extraterrestre', 'auto', 'automovil', 'al']

您可以使用sorted()并将其作为keylambda函数传递,该函数将字符串转换为自定义字母表中该字符串每个字符的索引列表:

words = ['miel', 'extraterrestre', 'al', 'automovil', 'auto', 'revestir']
g = 'zyxwvutsrqponmlkjihgfedcba'
sorted_words = sorted(words, key=lambda w: [g.index(c) for c in w])
<>强> P.S.这是最简单的,但绝对不是最快的解决方案,所以<强>如果你的输入列表很大,你应该考虑使用其他答案>的解决方案。p>

如果速度很重要,而且单词列表甚至有一定的长度,那么最好进行查找,而不是搜索每个单词的每个字符的索引

您可以使用字符串函数translate()maketrans()创建一种将输入字符串转换为翻译以进行排序的快速方法

例如:

# make translation table 
trans = str.maketrans(g, "".join(sorted(g))) 

# translate words works like:
"revestir".translate(trans)   # 'ivevhgri'

# sort with it:
sorted(l, key=lambda word: word.translate(trans))

# ['revestir', 'miel', 'extraterrestre', 'auto', 'automovil', 'al']

如果字符串中的字符不在字母表中,index()会阻塞,那么这也有利于对错误进行恢复。它们只是通过,比如:

"reve*stir".translate(trans)
# 'ivev*hgri'

相关问题 更多 >