对一个集合进行排序,每个元素有四条数据

2024-09-29 01:31:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一套:

{'6HUP ILE 228 D', '6HUP PHE 289 B', '6HUP PRO 233 D', '6HUP MET 286 E', '6HUP THR 237 A', '6HUP MET 236 D', '6HUP MET 261 B', '6HUP PHE 289 E', '6HUP LEU 285 B', '6HUP LEU 232 D', '6HUP TYR 210 D', '6HUP MET 236 A', '6HUP MET 261 E', '6HUP LEU 232 A', '6HUP THR 262 B', '6HUP VAL 203 D', '6HUP SER 205 D', '6HUP PRO 233 A', '6HUP SER 206 D', '6HUP HIS 102 D', '6HUP PHE 100 D', '6HUP SER 159 D', '6HUP LEU 269 D', '6HUP ASN 60 C', '6HUP MET 286 B', '6HUP PHE 77 C', '6HUP LEU 285 E', '6HUP TYR 160 D', '6HUP GLN 204 D', '6HUP ASN 265 E', '6HUP TYR 58 C', '6HUP THR 262 E', '6HUP ASN 265 B', '6HUP ILE 228 A'}

使用集合的一个片段,我想按以下方式对每个元素进行排序:

发件人:

 {'6HUP ILE 228 D', '6HUP ASN 60 C','6HUP PHE 289 B', '6HUP PRO 233 D', '6HUP MET 286 E', '6HUP THR 237 A','6HUP ILE 228 A','6HUP THR 262 B','6HUP PHE 77 C'}

致:

{'6HUP ILE 228 A', '6HUP THR 237 A','6HUP THR 262 B','6HUP PHE 289 B','6HUP ASN 60 C','6HUP PHE 77 C','6HUP ILE 228 D','6HUP PRO 233 D','6HUP MET 286 E'}

基本上,我想按索引[3](每个条目末尾的一个字母代码,A、B、C、d、E)和索引[2](即60228237262)对其进行排序,索引[3]是第一优先级,索引[2]是第二优先级。A从低到高,B从低到高,C从低到高,等等

谢谢


Tags: 元素排序方式valserprometasn
3条回答

使用带有关键字的排序函数

a = {'6HUP ILE 228 D', 
 '6HUP ASN 60 C',
 '6HUP PHE 289 B',
 '6HUP PRO 233 D', 
 '6HUP MET 286 E', 
 '6HUP THR 237 A',
 '6HUP ILE 228 A',
 '6HUP THR 262 B',
 '6HUP PHE 77 C'}

def sorter(item):
    item = item.split(' ')

    return(item[-1], item[-2])

sorted_list = sorted(a, key=sorter)
print(sorted_list)
output = ['6HUP ILE 228 A', 
'6HUP THR 237 A', 
'6HUP THR 262 B', 
'6HUP PHE 289 B', 
'6HUP ASN 60 C', 
'6HUP PHE 77 C', 
'6HUP ILE 228 D', 
'6HUP PRO 233 D', 
'6HUP MET 286 E']

试试看~

假设您的设置是myset。一种方法是使用下面的

[' '.join(k) for k in sorted([i.split() for i in myset], key=lambda x:(x[3],x[2]))]

输出:

['6HUP ILE 228 A',
 '6HUP THR 237 A',
 '6HUP THR 262 B',
 '6HUP PHE 289 B',
 '6HUP ASN 60 C',
 '6HUP PHE 77 C',
 '6HUP ILE 228 D',
 '6HUP PRO 233 D',
 '6HUP MET 286 E']

可以将sorted与自定义键一起使用:

a = {'6HUP ILE 228 D', '6HUP PHE 289 B', '6HUP PRO 233 D', '6HUP MET 286 E', '6HUP THR 237 A', '6HUP MET 236 D', '6HUP MET 261 B', '6HUP PHE 289 E', '6HUP LEU 285 B', '6HUP LEU 232 D', '6HUP TYR 210 D', '6HUP MET 236 A', '6HUP MET 261 E', '6HUP LEU 232 A', '6HUP THR 262 B', '6HUP VAL 203 D', '6HUP SER 205 D', '6HUP PRO 233 A', '6HUP SER 206 D', '6HUP HIS 102 D', '6HUP PHE 100 D', '6HUP SER 159 D', '6HUP LEU 269 D', '6HUP ASN 60 C', '6HUP MET 286 B', '6HUP PHE 77 C', '6HUP LEU 285 E', '6HUP TYR 160 D', '6HUP GLN 204 D', '6HUP ASN 265 E', '6HUP TYR 58 C', '6HUP THR 262 E', '6HUP ASN 265 B', '6HUP ILE 228 A'}

def last(str):
    return str.split()[-1]+str.split()[-2] # Returns a string that begins with the letter, followed by the number

print(sorted([l for l in a],key=last))

输出:

['6HUP ILE 228 A', '6HUP LEU 232 A', '6HUP PRO 233 A', '6HUP MET 236 A', '6HUP THR 237 A', '6HUP MET 261 B', '6HUP THR 262 B', '6HUP ASN 265 B', '6HUP LEU 285 B', '6HUP MET 286 B', '6HUP PHE 289 B', '6HUP TYR 58 C', '6HUP ASN 60 C', '6HUP PHE 77 C', '6HUP PHE 100 D', '6HUP HIS 102 D', '6HUP SER 159 D', '6HUP TYR 160 D', '6HUP VAL 203 D', '6HUP GLN 204 D', '6HUP SER 205 D', '6HUP SER 206 D', '6HUP TYR 210 D', '6HUP ILE 228 D', '6HUP LEU 232 D', '6HUP PRO 233 D', '6HUP MET 236 D', '6HUP LEU 269 D', '6HUP MET 261 E', '6HUP THR 262 E', '6HUP ASN 265 E', '6HUP LEU 285 E', '6HUP MET 286 E', '6HUP PHE 289 E']

相关问题 更多 >