Python, сортировка по ключу

#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']