比较python中的大量字典列表

Tuo*_*mas 11 python

我从来没有想过我会遇到python的速度问题,但我有.我试图根据字典值比较真正的大字典列表.我比较两个列表,第一个像这样

biglist1=[{'transaction':'somevalue', 'id':'somevalue', 'date':'somevalue' ...}, {'transactio':'somevalue', 'id':'somevalue', 'date':'somevalue' ...}, ...]
Run Code Online (Sandbox Code Playgroud)

'somevalue'代表用户生成的字符串,int或decimal.现在,第二个列表非常相似,除了id值始终为空,因为它们尚未分配.

biglist2=[{'transaction':'somevalue', 'id':'', 'date':'somevalue' ...}, {'transactio':'somevalue', 'id':'', 'date':'somevalue' ...}, ...]
Run Code Online (Sandbox Code Playgroud)

所以我想得到一个biglist2中的字典列表,它与biglist1中的字典匹配,除了 id 之外的所有其他键.

我一直在做

for item in biglist2:
    for transaction in biglist1:
       if item['transaction'] == transaction['transaction']:
          list_transactionnamematches.append(transaction)

for item in biglist2:
    for transaction in list_transactionnamematches:
       if item['date'] == transaction['date']:
          list_transactionnamematches.append(transaction)
Run Code Online (Sandbox Code Playgroud)

...等等,不比较id值,直到我得到最终的匹配列表.由于列表可能非常大(每个项目大约3000个以上),因此python循环需要相当长的时间.

我猜这不应该是如何进行这种比较的.有任何想法吗?

rec*_*ive 18

要用于查找的字段的索引.O(N + M)

matches = []
biglist1_indexed = {}

for item in biglist1:
    biglist1_indexed[(item["transaction"], item["date"])] = item

for item in biglist2:
    if (item["transaction"], item["date"]) in biglist1_indexed:
        matches.append(item)
Run Code Online (Sandbox Code Playgroud)

这可能比你现在做的快几千倍.

  • 有关python 3和其他版本中dict.keys()更改的信息:http://www.python.org/dev/peps/pep-3106/ (2认同)