为Python排序添加额外的规则

时间:2018-07-24 19:05:01

标签: python

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

示例代码:

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中的较大版本的字符串进行排序,取决于其在slist中的原始位置。一个示例是'LVQQWSVAVFLLSYAVPSCGRSVEGLSR''LVQQWSVAVFLLSYAVPSCGR'更远,slist的其他成员也有相反的情况,一些较小的字符串由于其在字符串中的原始位置而排在较大的字符串之上slist

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

有什么好办法吗?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

Python's default sort is stable,因此您可以链接排序:

slist.sort(key=len)
slist.sort(key=sequence.find)