我正在寻找一种比较两个班级名单的有效方法。
我有两个类的发票和事件。
我有event.invoice_id引用invoice.id。
两个列表都有3万行。
我要做的是删除在事件列表中未找到相关事件的发票。
这是我的代码,但是真的很慢,有没有办法更快呢?
for invoice in invoices:
found = [tEv for tEv in pEvents if docExistsInEvents(invoice,tEv)]
if not found:
invoices.remove(invoice)
def docExistsInEvents(pInvoice, pEvent):
if pInvoice.id == pEvent.invoice_id:
return True
谢谢
最佳答案
使用set
:
# assuming `invoices` contains all invoices and `events` all events
# build a set containing all relevant ids
event_invoice_ids = {event.invoice_id for event in events}
# create a list with only the relevant data by filtering invoices
# on the pre-built set of invoice ids
relevant_invoices = [invoice for invoice in invoices if invoice.id
in event_invoice_ids]
由于搜索是通过发票ID的哈希值完成的,因此速度会更快。
关于python - 比较两个不同类别的列表并根据属性删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48987179/