向Python排序添加额外规则
我想根据列表成员在字符串中的位置对其进行排序。但我也希望他们从最小到最大的长度订购 示例代码:向Python排序添加额外规则,python,Python,我想根据列表成员在字符串中的位置对其进行排序。但我也希望他们从最小到最大的长度订购 示例代码: slist = ['ATSEVSPNSK', 'AVSEHQLLHDK', 'TPGKK', 'LVQQWSVAVFLLSYAVPSCGRSVEGLSR', 'FGSDDEGR', 'PSPNTK', 'NHPVRFGSDDEGR', 'RLVQQWSVAVFLLSYAVPSCGR', 'RAVSEHQLLHDK', 'LVQQWSVAVFLLSYAVPSCGR', 'EQEKK'
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
中字符串的较大版本是在序列中相同位置开始的字符串上方还是下方排序取决于其在slist
中的原始位置。例如,'lvqwsvavfllsysavpscgrsvelsr'
比'lvqwsvavfllsysavpscgr'
在列表中的位置更靠前,对于slist
的其他成员,情况正好相反,一些较小的字符串由于其在slist
中的原始位置而被排序在较大的字符串之上
我想保持我原来的分类方式。但我也希望在slist
的成员中,在序列
的相同位置开始的,较短的字符串排序在较长的字符串之上
有什么好办法吗?在排序键中包含
len
每个元素
slist.sort(key=lambda x: (sequence.find(x), len(x)))
在排序键中包括
len
每个元素
slist.sort(key=lambda x: (sequence.find(x), len(x)))
,以便您可以链接您的排序:
slist.sort(key=len)
slist.sort(key=sequence.find)
,以便您可以链接您的排序:
slist.sort(key=len)
slist.sort(key=sequence.find)
这是行不通的,因为它首先按长度排序,然后按序列位置排序。考虑元组列表[(3, 4),(2, 1),(1,1),(2, 7),(-1, 2)]。如果我按此列表按第一个索引进行排序,然后分别按第二个索引进行排序,这与按
key=lambda x:(x[0],x[1])
进行排序不同。这与排序的稳定性无关。您需要从最低有效键开始,因此在您的示例中,按x[1]
排序,然后按x[0]
排序<代码>t=[(3,4),(2,1),(1,1),(2,7),(-1,2)];排序(排序(t,key=lambda x:x[1]),key=lambda x:x[0])==sorted(t)返回true我的观点是,单独排序两次并不总是返回与使用多值键排序一次相同的结果。我的例子可能不是一个具体的例子。回顾您的评论,sorted(t)
默认情况下选择每个元组的第0个索引作为排序依据值,因此当然,按x[1]
排序,然后按x[0]
将只返回与按x[0]
排序相同的列表。所以当然sorted(sorted(t,key=lambda x:x[1]),lambda x:x[0])==sorted(t)
返回True
。我想你只是通过例子重申了我的观点。这行不通,因为它首先按长度排序,然后按序列位置排序。考虑元组列表[(3, 4),(2, 1),(1,1),(2, 7),(-1, 2)]。如果我按此列表按第一个索引进行排序,然后分别按第二个索引进行排序,这与按key=lambda x:(x[0],x[1])
进行排序不同。这与排序的稳定性无关。您需要从最低有效键开始,因此在您的示例中,按x[1]
排序,然后按x[0]
排序<代码>t=[(3,4),(2,1),(1,1),(2,7),(-1,2)];排序(排序(t,key=lambda x:x[1]),key=lambda x:x[0])==sorted(t)返回true我的观点是,单独排序两次并不总是返回与使用多值键排序一次相同的结果。我的例子可能不是一个具体的例子。回顾您的评论,sorted(t)
默认情况下选择每个元组的第0个索引作为排序依据值,因此当然,按x[1]
排序,然后按x[0]
将只返回与按x[0]
排序相同的列表。所以当然sorted(sorted(t,key=lambda x:x[1]),lambda x:x[0])==sorted(t)
返回True
。我想你刚才通过例子重申了我的观点。