比较python中的大量字典列表

2024-06-08 10:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我从没想过我会遇到python的速度问题,但我确实遇到过。我试着根据字典的值来比较一大堆字典。我比较了两份名单

biglist1=[{'transaction':'somevalue', 'id':'somevalue', 'date':'somevalue' ...}, {'transactio':'somevalue', 'id':'somevalue', 'date':'somevalue' ...}, ...]

“somevalue”代表用户生成的字符串、int或decimal。现在,第二个列表非常相似,只是id值总是空的,因为它们还没有被分配。

biglist2=[{'transaction':'somevalue', 'id':'', 'date':'somevalue' ...}, {'transactio':'somevalue', 'id':'', 'date':'somevalue' ...}, ...]

所以我想得到一个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)

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

我想这并不是真正的比较方式。有什么想法吗?


Tags: inid列表fordateif字典item
3条回答

原谅我生疏的python语法,已经有一段时间了,所以考虑一下这个部分伪代码

import operator
biglist1.sort(key=(operator.itemgetter(2),operator.itemgetter(0)))
biglist2.sort(key=(operator.itemgetter(2),operator.itemgetter(0)))
i1=0;
i2=0;
while i1 < len(biglist1) and i2 < len(biglist2):
    if (biglist1[i1]['date'],biglist1[i1]['transaction']) == (biglist2[i2]['date'],biglist2[i2]['transaction']):
        biglist3.append(biglist1[i1])
        i1++
        i2++
    elif (biglist1[i1]['date'],biglist1[i1]['transaction']) < (biglist2[i2]['date'],biglist2[i2]['transaction']):
        i1++
    elif (biglist1[i1]['date'],biglist1[i1]['transaction']) > (biglist2[i2]['date'],biglist2[i2]['transaction']):
        i2++
    else:
        print "this wont happen if i did the tuple comparison correctly"

这将按(日期、事务)将两个列表按同一顺序排序。然后它肩并肩地穿过它们,穿过每一个寻找相对相邻的匹配。它假设(日期、交易)是唯一的,而且我在元组排序和比较方面并没有完全失控。

您要做的是使用正确的数据结构:

  1. 创建将第一个字典中的其他值的元组映射到其id的字典。

  2. 在两个字典中创建两组值。然后使用set操作获取所需的元组集。

  3. 使用点1的字典将id分配给那些元组。

要用于查找的字段的索引。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)

这可能比你现在做的要快上千倍。

相关问题 更多 >