Как выполнить числовую сортировку по квадратным скобкам - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующий сценарий, где текстовый файл имеет что-то вроде следующего вывода:

DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]
DecodingIndex[ 3]   PresentationIndex[ 1]
etc...

Так как он показывает числа в последовательном DecodingIndex, я хочу, чтобы он сортировался вместо PresentationIndex.Например:

DecodingIndex[ 3]   PresentationIndex[ 1]
DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]

Есть ли простой способ сделать это в Python?Эти цифры доходят до десятков тысяч.Расстояние между квадратными скобками всегда имеет пробел для чисел меньше 10, а затем обнимает числа, например DecodingIndex [32100]

Надеюсь, что это имело смысл, и спасибо за вашу помощь!

=======

Вот что я попробовал: 1) я перебираю каждую строку в файле и сохраняю в список строк [] 2) перебираю каждый элемент в списке строк [], используяследующий шаблон регулярных выражений re.compile(r'PresentationIndex\[(.*?)\]') 3) Затем я получаю совпадения из результата, используя group (), и сохраняю эти значения в новом списке. 4) Затем я сортирую список численно, сначала превращая элементы в int, затем сортируя,затем превращая его обратно в строку, подобную этой 5) Теперь я перебираю этот список и вставляю слова PresentationIndex и квадратные скобки в 6) Используя отсортированный теперь список PresentationIndex, я перебираю каждое из них.Для каждой итерации я перебираю весь выходной текстовый файл для поиска связанной строки и добавляю это в окончательный список.Таким образом, я получаю вывод в нужном порядке.

Я начал с файла длиной около 32 000 строк.Это заняло около 3 часов ...

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете вызвать sorted() для файла (потому что он действует как список строк) с функцией, которая извлекает вещь в скобках как key

import re
def extract_presentation_index(line):
    return int(re.search("\[\s*(\d+)\s*\]$", line).group(1))

# alternatively, in your case, you could avoid using a regex with something like
def extract_presentation_index(line):
    return int(line.split('[')[2].partition(']')[0])

with open('/path/to/your/file') as f:
    sorted_lines = sorted(f, key=extract_presentation_index)

    print(''.join(sorted_lines), end='')

end=''просто так, что вы не добавляете лишний символ новой строки в конце.

0 голосов
/ 02 октября 2018

Возможно, это не самый оптимальный вариант, но он должен помочь:

import re
from collections import OrderedDict

my_string = '''DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]
DecodingIndex[ 3]   PresentationIndex[ 1]'''

my_list = list(my_string.split("\n"))

my_dict = {}

for x in my_list:
    match = re.search("\[\s*(\d+)\s*\]$", x)
    my_dict[match.group(1)] = x

ordered_dict = OrderedDict(sorted(my_dict.items(), key=lambda t: t[0]))
print(ordered_dict)

Часть, которая может быть медленной для вас, читает файл в?Это все должно работать очень быстро.Я начинаю со строки, предполагая, что вы можете получить файл в строку.Я разделил строку на \n, но вы также можете просто прочитать файл, чтобы каждая строка была элементом в списке.

Затем я зациклил его и сопоставил регулярное выражение для того числа, по которому вы хотите отсортировать.Сделайте это значение key в dict.Затем с помощью collections сортируйте словарь по ключу.Все сделано!Надеюсь, это поможет.

...