#python #list #sorting #re
#питон #Список #сортировка #ре
Вопрос:
У меня возникли проблемы с пониманием key
параметра в sorted
функции в Python. Допустим, приведен следующий список: sample_list = ['Date ', 'of', 'birth', 'year 1990', 'month 10', 'day 15']
и я хотел бы отсортировать только строки, содержащие число.
Ожидаемый результат: ['Date ', 'of', 'birth', 'month 10', 'day 15', 'year 1990']
До сих пор мне удавалось напечатать только строку с номером
def sort_with_key(element_of_list): if re.search('d ', element_of_list): print(element_of_list) return element_of_list
sorted(sample_list, key = sort_with_key)
Но как мне на самом деле отсортировать эти элементы? Спасибо!
Комментарии:
1. Совершенно непонятно, чего вы хотите достичь. Функция, которую вы передаете как
key
, применяется к каждому элементу, т. Е. вы не можете сортировать только некоторые элементы с помощью ключа. Однако вы можете отсортировать часть списка и создать новый, объединяющий несортированные (первые 3 элемента) и отсортированные (остальные элементы). Тем не менее, как именно вы «сортируете» день, месяц и год, то есть я не думаю, что вы действительно имеете в виду «сортировку», но заказываете месяц, день, год. Кроме того, — как вы вообще получили этот список?2. @буран есть ответ, спасибо за комментарий!
Ответ №1:
Мы можем попробовать сортировать с помощью лямбды:
sample_list = ['Date ', 'of', 'birth', 'year 1990', 'month 10', 'day 15'] sample_list = sorted(sample_list, key=lambda x: int(re.findall(r'd ', x)[0]) if re.search(r'd ', x) else 0) print(sample_list)
Это печатает:
['Date ', 'of', 'birth', 'month 10', 'day 15', 'year 1990']
Логика, используемая в лямбде, заключается в сортировке по номеру в каждой записи списка, если у записи есть номер. В противном случае он присваивает нулевое значение другим записям, помещая их первыми в сортировку.
Комментарии:
1. что делать, если день 02, а месяц 12? Я действительно не думаю, что ОП ожидал бы, что день наступит раньше месяца
2. @буран Я хотел отсортировать только по номеру, день/месяц/год не имеют значения. Извините за путаницу
3. @буран Я согласен, что эта предпосылка может показаться бессмысленной. Но, возможно, приведенные примеры данных являются просто анекдотическими, и общая проблема заключается в том, чтобы просто отсортировать их по целочисленному значению в каждой записи списка.
Ответ №2:
Если я правильно понимаю, вы хотите, чтобы строки с номером сортировались с этим номером в качестве ключа, а строки без номера находились в начале?
Вам нужен ключ, который извлекает номер из строки. Мы можем использовать str.isdigit()
его для извлечения цифр из строки, ''.join()
для объединения этих цифр вместе и int()
для преобразования в целое число. Если в строке нет цифр, мы -1
вместо этого вернемся, поэтому она стоит перед всеми неотрицательными числами.
sample_list = ['Date ', 'of', 'birth', 'year 1990', 'month 10', 'day 15', 'answer 42', 'small number 0', 'large number 8676965', 'no number here'] sample_list.sort(key=lambda s: int(''.join(c for c in s if c.isdigit()) or -1)) print(sample_list) # ['Date ', 'of', 'birth', 'no number here', 'small number 0', 'month 10', 'day 15', 'answer 42', 'year 1990', 'large number 8676965']