我目前正在使用Python 2.7解析两个JSON文件。目标是将file1中的每个JSON对象检查到file2上的每个JSON对象,并使用他们的'名称'进行比较。键。如果匹配,则用obj1数据覆盖obj2。我的伪代码(下面)现在将在O(n ^ 4)时间内运行。这太慢了,所以如果有人能指出一种更快的方法,我会很感激。
for obj1 in file1:
for key1, value1 in obj1.iteritems():
if key1 == 'name':
for obj2 in file2:
for key2, value2 in obj2.iteritems():
if key2 == 'name':
if value1 == value2:
overwrite obj2 using obj1 data
答案 0 :(得分:4)
将file1
中的对象存储在字典中,并按name
键入:
file1_names = {}
for obj1 in file1:
if 'name' not in obj1:
continue
file1_names.setdefault(obj1['name'], []).append(obj1)
现在您可以在O(1)时间内查找这些对象:
for obj2 in file2:
if 'name' not in obj2:
continue
for obj1 in file1_names.get(obj2['name'], []):
obj2.update(obj1)
以上内容仅扫描file1
和file2
一次,使整体时间复杂度为O(N),其中N是两个文件中对象的总数。
我做了以下假设:
obj1
中的名称不是唯一的,因此会将每个名称收集到列表中。'name'
密钥可能丢失。如果这些假设不成立(因此名称是唯一的且始终给出),您可以将上述内容简化为:
file1_names = {o['name']: o for o in file1}
for obj2 in file2:
obj2.update(file1_names.get(obj2['name'], {}))
答案 1 :(得分:1)
你的文件有多大?是否有任何担心将它们加载到内存中?我会做类似跟随伪代码的事情:
我假设obj1,obj2是字典,因为你使用的是iteritems。
dict1 = dict( (o['name'], o) for o in file1 )
dict2 = dict( (o['name'], o) for o in file2 )
dict2.update(dict1)