Как сравнить два списка с третьим списком и, если совпадение существует, сгруппировать их во вложенный список в Python? - PullRequest
0 голосов
/ 26 января 2019

У меня есть следующие имена файлов в списке (filelist):

filelist = ['ABC.dat',
            'ABC3.dat',
            'ABC10.dat',
            'ABC956.dat',
            'XYZ_PQR_JKL.dat',
            'XYZ_PQR_JKL_1.dat',
            'XYZ_PQR3_JKL.dat',
            'XYZ_PQR3_JKL_1.dat',           
            'XYZ_PQR10_JKL.dat',
            'XYZ_PQR10_JKL_1.dat',
            'XYZ_PQR956_JKL.dat',
            'XYZ_PQR956_JKL_1.dat']

unique_filelist = ['ABC.dat',
                    'XYZ_PQR_JKL.dat',
                    'XYZ_PQR_JKL_1.dat',]

В основном набор файлов генерируется в разное время, то есть 3, 10, 956 в данном случае, что я знаю заранее,Мне нужно сгруппировать файлы на основе этого времени (набор файлов), то есть следующий вложенный список должен быть создан в качестве вывода:

[['ABC.dat', 'ABC3.dat', 'ABC10.dat', 'ABC956.dat'],
['XYZ_PQR_JKL.dat', 'XYZ_PQR3_JKL.dat', 'XYZ_PQR10_JKL.dat', 'XYZ_PQR956_JKL.dat'],         
['XYZ_PQR_JKL_1.dat', 'XYZ_PQR3_JKL_1.dat', 'XYZ_PQR10_JKL_1.dat', 'XYZ_PQR956_JKL_1.dat']]

Я пытаюсь сравнить список файлов с набором файлов и unique_filelist, и если они соответствуют добавитьк списку.Ниже приведен MWE, который не соответствует назначению:

MWE

import re
filelist = ['ABC.dat',
            'ABC3.dat',
            'ABC10.dat',
            'ABC956.dat',
            'XYZ_PQR_JKL.dat',
            'XYZ_PQR_JKL_1.dat',
            'XYZ_PQR3_JKL.dat',
            'XYZ_PQR3_JKL_1.dat',           
            'XYZ_PQR10_JKL.dat',
            'XYZ_PQR10_JKL_1.dat',
            'XYZ_PQR956_JKL.dat',
            'XYZ_PQR956_JKL_1.dat']

fileset = [3, 10, 956]

unique_filelist = ['ABC.dat',
                    'XYZ_PQR_JKL.dat',
                    'XYZ_PQR_JKL_1.dat',]

for i in filelist:
    for j in fileset:
        search_go_to = set([unique_filelist, str(j)])
        m = ' .*? '.join(x for x in search_go_to)
        matches = [s for s in filelist if re.search(m, s)]
        print (matches)

Как сравнить два списка с третьим списком и, если существует группа соответствияих во вложенный список?

Ответы [ 2 ]

0 голосов
/ 27 января 2019
  1. Сначала удалите суффикс «.dat» из filelist и unique_filelist

    mod_filelist = [s[:-4] for s in filelist] mod_unique_filelist = [s[:-4] for s in unique_filelist]

  2. Затем,разделить mod_filelist элементов на _

    mod_filelist = [s.split('_') for s in mod_filelist]

  3. После этого удалить цифры, за которыми следуют буквенные символы

    mod_filelist = [[re.sub(r"(\w)(\d)+", r"\1", sub_str) for sub_str in s] for s in mod_filelist]

  4. Объединить подстроки каждого элемента в измененном filelist

    mod_filelist = ['_'.join(sub for sub in s) for s in mod_filelist]

  5. Создать требуемый вложенный список с помощьюодин элемент в каждом

    result = [[unique_fname] for unique_fname in unique_filelist]

  6. Создать регулярное выражение с каждым уникальным именем файла в качестве группы

    filenames_re = re.compile(r'|'.join('(' + ufname + ')' for ufname in mod_unique_filelist))

  7. Наконец, заполните result по желанию

    for i, mod_fname in enumerate(mod_filelist): m = re.fullmatch(filenames_re, mod_fname) result[m.lastindex-1].append(filelist[i])

Надеюсь, что поможет:)

0 голосов
/ 26 января 2019

Мое решение использует небольшое понимание списка.

Мне пришлось изменить записи unique_filelist, чтобы они были регулярными выражениями, чтобы показать, где были вставлены «времена», так как он находится в середине базового имени (в противном случае os.file.basename и string.startswith были бы адекватными).

Кроме того, я не использовал file_set, так как он не был необходим для данных примера.Вы можете добавить дополнительный фильтр, если в file_list должно быть 'times', которого нет в file_set.

Наконец, обратите внимание, что есть два броска от итераторов к спискам, но это просто для печати результата,Если бы вы имели дело с большими наборами данных, то лучше бы их пропустить, тогда вы могли бы перебрать «результат» эффективным способом памяти.

import re

file_list = ['ABC.dat',
             'ABC3.dat',
             'ABC10.dat',
             'ABC956.dat',
             'XYZ_PQR_JKL.dat',
             'XYZ_PQR_JKL_1.dat',
             'XYZ_PQR3_JKL.dat',
             'XYZ_PQR3_JKL_1.dat',
             'XYZ_PQR10_JKL.dat',
             'XYZ_PQR10_JKL_1.dat',
             'XYZ_PQR956_JKL.dat',
             'XYZ_PQR956_JKL_1.dat']

fileset = [3, 10, 956]

unique_file_list = [r'ABC\d*.dat',
                    'XYZ_PQR\d*_JKL.dat',
                    'XYZ_PQR\d*_JKL_1.dat', ]

def unique_list():
    for unique in unique_file_list:
        yield list(file for file in file_list if re.match(unique, file))

print(list(unique_list()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...