在python中过滤json对象的json数组的有效方法

2024-10-04 03:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

Tags: 文件ioimportjson示例sourceres逻辑
1条回答
网友
1楼 · 发布于 2024-10-04 03:25:46

这里的问题是当你检查这个术语是否已经存在时(例如,当你检查if x['TERM'].lower() not in resTerms:)时。这是因为resTerms是一个list,查找复杂度是O(n),因此整个算法变成O(n2)

解决这一问题的方法是使用set,而不是list,它在O(1)时具有查找共通性。然后循环看起来像这样(您也不需要保持json文件的打开状态)

import json
import io
input1 = "movies.json"
res=[]
resTerms = set()
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.add(x['TERM'].lower())

关于Python数据结构和时间复杂性的指南,可以在这里找到: https://wiki.python.org/moin/TimeComplexity

相关问题 更多 >