我有一个json示例:
{"ratings": [{
"TERM": "movie1",
"Rating": "3.5",
"source": "15786"
},
{
"TERM": "movie2",
"Rating": "3.5",
"source": "15786"
},
{
"TERM": "Movie1",
"Rating": "3.0",
"source": "15781"
}
]}
现在我想从这个文件中创建一个新的json文件,如果这个术语已经存在一次,那么过滤的逻辑是忽略一个json对象。因此,对于这个示例,输出将是
^{pr2}$由于movie1已存在于索引0中,因此我们希望忽略索引2。在
我想出了下面这个逻辑,对小样本来说很好。我有一个json数组大小为1000万的示例,下面的代码需要2天以上才能完成。我想知道是否有更有效的方法来做到这一点:
import json
import io
input1 = "movies.json"
res=[]
resTerms = []
with io.open(input1, encoding="utf8") as json_data:
d = json.load(json_data)
print(len(d['ratings']))
for x in d['ratings']:
if x['TERM'].lower() not in resTerms:
res.append(x)
resTerms.append(x['TERM'].lower())
final ={}
final["ratings"] = res
output = "myFileSelected.json"
with io.open(output, 'w') as outfile:
json.dump(final, outfile)
这里的问题是当你检查这个术语是否已经存在时(例如,当你检查
if x['TERM'].lower() not in resTerms:
)时。这是因为resTerms
是一个list
,查找复杂度是O(n),因此整个算法变成O(n2)解决这一问题的方法是使用
set
,而不是list
,它在O(1)时具有查找共通性。然后循环看起来像这样(您也不需要保持json文件的打开状态)关于Python数据结构和时间复杂性的指南,可以在这里找到: https://wiki.python.org/moin/TimeComplexity
相关问题 更多 >
编程相关推荐