根据另一个列表中的值对列表进行排序

时间:2020-05-28 17:14:40

标签: python list dictionary listview

我有两个清单; invoice_ordering_listpdfs。我需要根据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 个答案:

答案 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,以使文件名与订单字典中的索引匹配。
  • 使用顺序字典中的索引作为关键字进行排序,然后压缩第一个索引以给出仅包含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]]

实时代码-> 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号。

实时代码-> https://onlinegdb.com/Sy1zH9ao8