我正在寻找一种比较两个班级名单的有效方法。

我有两个类的发票和事件。
我有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/

10-10 17:42