Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Python排序添加额外规则_Python - Fatal编程技术网

向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
。我想你刚才通过例子重申了我的观点。