簡體   English   中英

必須有一個更優化的方法來解析兩個文件

[英]There must be a more optimal way to parse two files

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

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僅掃描一次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'], {}))

您的文件有多大? 是否有任何擔心將它們加載到內存中? 我將執行以下偽代碼操作:

我假設obj1,obj2是字典,因為您正在使用迭代項。

dict1 = dict( (o['name'], o) for o in file1 )
dict2 = dict( (o['name'], o) for o in file2 )
dict2.update(dict1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM