[英]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
僅掃描一次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'], {}))
您的文件有多大? 是否有任何擔心將它們加載到內存中? 我將執行以下偽代碼操作:
我假設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.