如何在python中按AaB而不是AB的顺序对字符串排序

2024-05-20 13:42:43 发布

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

我正在尝试对字符串进行排序(为punnetsquare生成一个基因型)。 我目前的实施是:

unsorted_genotype = 'ABaB'
sorted_genotype = sorted(list(unsorted_genotype))
sorted_string = ''.join(sorted_genotype)

It输出

'ABBa'

不过,我希望:

'AaBB'

我该如何更改或修复此问题?你知道吗


Tags: 字符串string排序itlistsortedjoin基因型
2条回答

您可以向排序函数传递一个键:

unsorted_genotype = 'ABaB'
sorted_genotype = sorted(unsorted_genotype, key=lambda x: x.lower())
''.join(sorted_genotype)

'AaBB'

可以指定sorting key并使用元组排序:

[(1,1),(1,2)]:元组按第1个元素排序,相等时按第2到第n个元素排序:

unsorted = 'ABaB'
s = sorted(unsorted, key= lambda x:(x.lower(),x))  
print(''.join(s))  # 'AaBB'

这确保了它首先按“较低”字符排序—将aA组合在一起,然后按实际字符排序,这样它们也会被排序:ABaaAAaAaAAAB => AAAAAAAaaaaBB

阅读:

一个简单的key = str.lower正如在被指控的被骗者中所建议的那样,并不把A归为Aa归为a,这对Prunnet squares来说是很好的


如果让它们按出现顺序排列,然后将小写和大写组合在一起,则可以使用:

unsorted = 'ABaaAAaAaAAAB'
s = sorted(unsorted, key=str.lower)  # not by tuple, just by lower
print(''.join(s))  

使元素保持“有序”:

AaaAAaAaAAABB   # instead of  AAAAAAAaaaaBB

并在case-insensitive list sorting, without lowercasing the result?中描述

相关问题 更多 >