我想根据列表成员在字符串中的位置对列表成员进行排序。但我也希望它们按长度从小到大排序。
示例代码:
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)))
