Сортировка списка, чтобы буквы стояли перед цифрами в любой позиции - PullRequest
0 голосов
/ 07 декабря 2018

Скажем, у меня есть следующий список:

l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']

При использовании sorted() над списками строк, которые также содержат цифры, цифры идут перед буквами, поэтому в этом случае это приведет к:

sorted(l)
['a1', 'aa', 'ae', 'erge4', 'erge7', 'erget', 'm1', 'm2', 'me2', 'mea', 'mei']

Я видел несколько ответов, таких как этот о том, как заставить буквы появляться перед цифрами, но только для одной цифры или буквы.Можно ли сделать это, используя key в sorted(), когда цифра может быть где угодно в строке?Итак, ожидаемый результат:

['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']

Ответы [ 3 ]

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

Вы можете использовать ключевую функцию, которая перебирает каждый символ данной строки и добавляет 'z' к тем, которые являются цифрами, так что они сортируются по алфавиту:

l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
sorted(l, key=lambda s: ['z' + c if c.isdigit() else c for c in s])

Возвращает:

['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
0 голосов
/ 07 декабря 2018

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

L = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
res = sorted(L, key=lambda x: [(i.isdigit(), i) for i in x])

# ['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
0 голосов
/ 07 декабря 2018

бит взлома:

>>> l = ['erget', 'a1', 'm1', 'aa', 'ae', 'mea', 'erge4', 'erge7', 'm2', 'me2', 'mei']
>>> sorted(l, key=lambda a: [ord(c) if ord(c) > 57 else ord(c) + 100 for c in a])
['aa', 'ae', 'a1', 'erget', 'erge4', 'erge7', 'mea', 'mei', 'me2', 'm1', 'm2']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...