Как отсортировать строку в python по порядку AaB вместо ABa - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь отсортировать строку (чтобы сделать генотип для punnetsquare).Моя текущая реализация:

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

Это выводит

'ABBa'

Хотя я бы хотел и ожидал:

'AaBB'

Как я могу изменить или исправить это?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете указать ключ сортировки и использовать сортировку для кортежей:

[(1,1),(1,2)]: кортежи сортируются по 1-му элементу при равенстве от 2-го до n-го:

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

Это гарантирует, что сначала он будет отсортирован по «нижнему» символу - группировка a и A вместе, а затем по фактическому символу впоследствии, чтобы они также сортировались: ABaaAAaAaAAAB => AAAAAAAaaaaBB

Показания:

Простойkey = str.lower, как указано в заявленном обмане, не группирует A до A и a до a, что было бы неплохо иметь для квадратов Пруннета


Если вы хотите, чтобы они оставались в порядке вхождения, а затем группировались в верхнем и нижнем регистре, вы можете использовать:

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

, в результате чего элементы сохраняются в «порядке»:

AaaAAaAaAAABB   # instead of  AAAAAAAaaaaBB

и описывается в сортировке списка без учета регистра, без нижнего регистра результата?

0 голосов
/ 19 декабря 2018

Вы можете передать ключ функции сортировки:

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

'AaBB'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...