我从没想过我会遇到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需要相当长的时间循环。
我想这并不是真正的比较方式。有什么想法吗?
原谅我生疏的python语法,已经有一段时间了,所以考虑一下这个部分伪代码
这将按(日期、事务)将两个列表按同一顺序排序。然后它肩并肩地穿过它们,穿过每一个寻找相对相邻的匹配。它假设(日期、交易)是唯一的,而且我在元组排序和比较方面并没有完全失控。
您要做的是使用正确的数据结构:
创建将第一个字典中的其他值的元组映射到其id的字典。
在两个字典中创建两组值。然后使用set操作获取所需的元组集。
使用点1的字典将id分配给那些元组。
要用于查找的字段的索引。O(n+m)
这可能比你现在做的要快上千倍。
相关问题 更多 >
编程相关推荐