Для некоторого слова со смешанными буквами (как заглавными, так и маленькими), которые также могут занимать пробелы (но не цифры или специальные символы), я хочу, чтобы вывод отображался в виде заглавных букв (все повторения символа, если они присутствуют), за которыми следуют строчные (все повторения персонажа, если присутствуют).

Порядок букв будет выглядеть как AAaaBBbbCCcc.....

Я пытался сделать это, используя встроенные модули sorted и list.sort.

word =  'hoLllLywOoDo'
sorted_list = sorted(word ,key = lambda s: s.capitalize())
print(''.join(sorted_list))

Например, учитывая hoLllLywOoDo я ожидаю DhLLllOooowy. Вместо этого он возвращает DhLllLoOoowy, а это не то, что я хочу.

0
hvce 9 Июл 2019 в 20:49

3 ответа

Лучший ответ

Используйте кортеж внутри вашей ключевой функции:

sorted_list = sorted(word ,key = lambda s: (s.upper(),s ))

Второй параметр кортежа появится в руках, когда первый параметр будет идентичен: сначала будут отсортированы буквы в верхнем регистре (сортировка 'D' и 'd' одинаковы), а затем отсортированы по букве ({{X2 }} - следовательно, D стоит первым)

И вы получите:

DhLLllOooowy

str.capitalize не нужен, вы все равно имеете дело с отдельными буквами - заглавные буквы хороши для слов, начинающихся с заглавной буквы - здесь вы можете использовать верхнюю.

1
Patrick Artner 9 Июл 2019 в 18:08

Использование str.capitalize означает, что при сортировке учитывается только заглавная версия буквы. Таким образом, алгоритму сортировки a и A будут равны.

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

>>> ''.join(sorted(word, key=lambda c: (c.capitalize(), c)))
'DhLLllOooowy'
0
Edward Minnix 9 Июл 2019 в 17:53

Поскольку вы используете заглавную букву в качестве ключа, L и l имеют один и тот же ключ. Но похоже, что вы хотите отсортировать по буквам, а затем по заглавным буквам. Итак, вы должны попробовать использовать «два» ключа, используя такой кортеж:

sorted_list = sorted(word, key = lambda s: (s.capitalize(), s))
1
brandonwang 9 Июл 2019 в 18:01