必须有一种更优化的方法来解析两个文件

时间:2014-09-12 18:31:21

标签: python json parsing python-2.7

我目前正在使用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

2 个答案:

答案 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)

以上内容仅扫描file1file2一次,使整体时间复杂度为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)