Skip to main content
 首页 » 编程设计

python之向 Python 排序添加额外规则

2025年05月04日10jirigala

我想根据列表成员在字符串中的位置对列表成员进行排序。但我也希望它们按长度从小到大排序。

示例代码:

slist = ['ATSEVSPNSK', 
 'AVSEHQLLHDK', 
 'TPGKK', 
 'LVQQWSVAVFLLSYAVPSCGRSVEGLSR', 
 'FGSDDEGR', 
 'PSPNTK', 
 'NHPVRFGSDDEGR', 
 'RLVQQWSVAVFLLSYAVPSCGR', 
 'RAVSEHQLLHDK', 
 'LVQQWSVAVFLLSYAVPSCGR', 
 'EQEKK', 
 'YLTQETNKVETYK', 
 'RFFLHHLIAEIHTAEIR', 
 'VETYK', 
 'GKSIQDLR', 
 'YLTQETNK', 
 'FGSDDEGRYLTQETNK', 
 'VETYKEQPLK', 
 'GKPGK', 
 'PSPNTKNHPVR', 
 'FFLHHLIAEIHTAEIRATSEVSPNSK', 
 'SIQDLRR', 
 'AVSEHQLLHDKGK', 
 'ATSEVSPNSKPSPNTK', 
 'SIQDLR', 
 'SVEGLSRR', 
 'FFLHHLIAEIHTAEIR', 
 'KEQEK', 
 'EQPLKTPGK', 
 'EQPLK', 
 'NHPVR', 
 'SVEGLSR'] 
 
sequence = 'MQRRLVQQWSVAVFLLSYAVPSCGRSVEGLSRRLKRAVSEHQLLHDKGKSIQDLRRRFFLHHLIAEIHTAEIRATSEVSPNSKPSPNTKNHPVRFGSDDEGRYLTQETNKVETYKEQPLKTPGKKKKGKPGKRKEQEKKKRRTRSAWLDSGVTGSGLEGDHLSDTSTTSLELDSRRH' 

这就是我要改进的地方:

slist.sort(key=lambda x: sequences.find(x)) 
 
slist 
Out[9]:  
['RLVQQWSVAVFLLSYAVPSCGR', 
 'LVQQWSVAVFLLSYAVPSCGRSVEGLSR', 
 'LVQQWSVAVFLLSYAVPSCGR', 
 'SVEGLSRR', 
 'SVEGLSR', 
 'RAVSEHQLLHDK', 
 'AVSEHQLLHDK', 
 'AVSEHQLLHDKGK', 
 'GKSIQDLR', 
 'SIQDLRR', 
 'SIQDLR', 
 'RFFLHHLIAEIHTAEIR', 
 'FFLHHLIAEIHTAEIRATSEVSPNSK', 
 'FFLHHLIAEIHTAEIR', 
 'ATSEVSPNSK', 
 'ATSEVSPNSKPSPNTK', 
 'PSPNTK', 
 'PSPNTKNHPVR', 
 'NHPVRFGSDDEGR', 
 'NHPVR', 
 'FGSDDEGR', 
 'FGSDDEGRYLTQETNK', 
 'YLTQETNKVETYK', 
 'YLTQETNK', 
 'VETYK', 
 'VETYKEQPLK', 
 'EQPLKTPGK', 
 'EQPLK', 
 'TPGKK', 
 'GKPGK', 
 'KEQEK', 
 'EQEKK'] 

slist 中较大版本的字符串是排在 sequence 中相同位置开始的字符串之上还是之下取决于它在 中的原始位置列表。一个例子是 'LVQQWSVAVFLLSYAVPSCGRSVEGLSR' 比 'LVQQWSVAVFLLSYAVPSCGR' 更靠前,相反的情况也适用于 slist 的其他成员,一些由于它们在 slist 中的原始位置,较小的字符串排在较大的字符串之上。

我想保留我原来的排序方式。但我也希望在 sequence 中从相同位置开始的 slist 成员中,较短的字符串排在较长的字符串之上。

有什么好的方法吗?

请您参考如下方法:

在排序键中包含len每个元素

slist.sort(key=lambda x: (sequence.find(x), len(x)))