我有两个清单; 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',
]
答案 0 :(得分:1)
尝试这种方式:
第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])
答案 1 :(得分:0)
对于正则表达式来说,这似乎是一个问题。如评论中所述,实际问题是从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/测试正则表达式匹配模式,这非常有帮助。
答案 2 :(得分:0)
re.search()
从文件名获取ID,以使文件名与订单字典中的索引匹配。 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]]
实时代码-> 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))
在这里,如果没有在订购列表中找到文件ID号,我将使用get_key()
函数来返回文件ID号。