Переупорядочить список на основе совпадений регулярных выражений в Python 2.7? - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы изменить порядок списка строк (заголовки столбцов из Pandas) в Python 2.7.13 на основе регулярного выражения.Желаемый вывод будет иметь текущий элемент индекса 0 в том же месте, за которым сразу же будут найдены совпадающие строки, найденные с помощью регулярного выражения, а затем оставшиеся строки.

# Here's the input list:
cols = ['ID', 'MP', 'FC', 'Dest_MP', 'Dest_FC', 'Origin_MP', 'Origin_FC']

# And the desired output:
output_cols = ['ID', 'FC', 'Dest_FC', 'Origin_FC', 'MP', 'Dest_MP', 'Origin_MP']

У меня есть пример рабочего кода.Это не красиво, и именно поэтому я здесь.

import re

cols = ['ID', 'MP', 'FC', 'Dest_MP', 'Dest_FC', 'Origin_MP', 'Origin_FC']

pattern = re.compile(r'^FC|FC$')
matched_cols = filter(pattern.search, cols)

indices = [0] + [cols.index(match_column) for match_column in matched_cols]

output_cols, counter = [], 0
for index in indices:
    output_cols.append(cols.pop(index - counter))
    counter += 1

output_cols += cols

print(output_cols)

Есть ли более читаемый, более питонский способ сделать это?

1 Ответ

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

Изолировать первый элемент, никак не обойтись.

Затем, в остальной части списка, использовать ключ сортировки, который возвращает пару:

  • первый приоритет - логическое значение дляуказать, соответствует ли это регулярному выражению или нет (отрицается, поэтому он появляется первым)
  • второй приоритет самого элемента для сопоставления / несоответствия элементов

следующим образом:

import re

cols = ['ID', 'MP', 'FC', 'Dest_MP', 'Dest_FC', 'Origin_MP', 'Origin_FC']

new_cols = [cols[0]] + sorted(cols[1:],key=lambda x : (not bool(re.search("^FC|FC$",x)),x))

результат:

['ID', 'Dest_FC', 'FC', 'Origin_FC', 'Dest_MP', 'MP', 'Origin_MP']

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

key=lambda x : (not bool(re.search("^FC|FC$",x)),len(x),x)

Результат теперь:

['ID', 'FC', 'Dest_FC', 'Origin_FC', 'MP', 'Dest_MP', 'Origin_MP']

Обратите внимание, что sort стабильно, поэтомуможет быть, вам вообще не нужен тай-брейк:

new_cols = [cols[0]] + sorted(cols[1:],key=lambda x : not bool(re.search("^FC|FC$",x)))

результат:

['ID', 'FC', 'Dest_FC', 'Origin_FC', 'MP', 'Dest_MP', 'Origin_MP']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...