Сортировка списка по значениям в другом списке - PullRequest
0 голосов
/ 28 мая 2020

У меня два списка; invoice_ordering_list и pdfs. Мне нужно отсортировать pdfs в порядке invoice_ordering_list.

invoice_ordering_list = ['265189', '265195', '265114', '265166', '265165', '265115']

pdfs = [
    'Est. 57349 April Bill Inv 265115.pdf',
    'AH_202015_JUN_57768 265189.pdf',
    'AH_202015_MAY FEE_265195.pdf',
    'Est. 56534 April Bill Inv 265165.pdf',
    'Est. 57279 April Bill Inv 265166.pdf',
    'Est. 42477 April Bill Inv 265114.pdf',
]

Я пробовал:

keydict = dict(zip(pdfs, invoice_ordering_list))
pdfs.sort(key=keydict.get)

По какой-то причине он почти получает правильный порядок, но 265189 заканчивается в конце. Я, должно быть, неправильно понимаю, что здесь происходит. это кажется такой простой задачей, что я просто не могу понять.

Результат должен быть:

pdfs_new = [
    'AH_202015_JUN_57768 265189.pdf',
    'AH_202015_MAY FEE_265195.pdf',
    'Est. 42477 April Bill Inv 265114.pdf',
    'Est. 57279 April Bill Inv 265166.pdf',
    'Est. 56534 April Bill Inv 265165.pdf',
    'Est. 57349 April Bill Inv 265115.pdf',
]

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Попробуйте так:

Шаг 1: создайте словарь, получая ключ от имени файла pdf

На этом шаге я извлекаю цифры только из последней строки, соединенной с .pdf

d={}
for p in pdfs:
 key = re.findall(r'\d+',p.split()[-1].rstrip('.pdf'))[0] 
 d[key] =  p

Шаг 2: создайте новый список для хранения имени файла в соответствии с вашим invoice_ordering_list

new_pdf=[]
for k in invoice_ordering_list:
  new_pdf.append(d[k])
0 голосов
/ 28 мая 2020
  • Создать словарь из списка упорядочивания с именами файлов в качестве ключей и индексом в качестве значений.
  • Используйте re.search(), чтобы получить идентификатор из имен файлов, чтобы сопоставить имена файлов с индексами из заказать словарь.
  • Выполните сортировку, используя индекс из словаря порядка в качестве ключа, и удалите первый индекс, чтобы получить отсортированный список только имен PDF.
order_dict = {val: key for key, val in enumerate(invoice_ordering_list)}

sorted_list = sorted([[el, order_dict[re.search("\d+(?=\.\w+$)", el).group()]] \
                for el in pdfs], key = lambda l: l[1])

sorted_pdfs = [a for a in list(zip(*sorted_list))[0]]

Live Код -> https://onlinegdb.com/SkoNfFajL

Или используйте функцию для возврата ключа сортировки

order_dict = {val: key for key, val in enumerate(invoice_ordering_list)}

def get_key(file):
    id_num = re.search("\d+(?=\.\w+$)", file).group()
    return order_dict[id_num] if id_num in order_dict else int(id_num)

pdfs.sort(key= lambda name: get_key(name))

Здесь, У меня есть функция get_key(), возвращающая номер идентификатора файла, если он не найден в списке заказа.

Live Code -> https://onlinegdb.com/Sy1zH9ao8

0 голосов
/ 28 мая 2020

Это похоже на проблему с регулярным выражением. Как обсуждалось в комментариях, актуальная проблема заключается в извлечении номера ключа сортировки из имени файла PDF. Я создал простой шаблон соответствия, чтобы извлечь целое число из конца имени файла PDF и использовать его в качестве ключа для sort.

import re

pdfs = [
    'Est. 57349 April Bill Inv 265115.pdf',
    'AH_202015_JUN_57768 265189.pdf',
    'AH_202015_MAY FEE_265195.pdf',
    'Est. 56534 April Bill Inv 265165.pdf',
    'Est. 57279 April Bill Inv 265166.pdf',
    'Est. 42477 April Bill Inv 265114.pdf',
]

def pdf_key(s):
    return int(re.search(r'(\d+)\.pdf$',s).group(1))

pdfs.sort(key=pdf_key)

print(pdfs)

PS. Я использую https://regex101.com/ для тестирования шаблонов соответствия регулярных выражений, и это очень полезно.

...