基于1-2个常用键值获取4个JSON文件的交集?(Python)



以下是4个JSON文件:

  • 3 JSON文件有3个关键字段:名称、评级和年份
  • 1 JSON只有2个关键字段:名称、评级(无年份(
[
{
"name": "Apple",
"year": "2014",
"rating": "21"
},
{
"name": "Pear",
"year": "2003",
"rating": ""
},
{
"name": "Pineapple",
"year": "1967",
"rating": "60"
},
]
[
{
"name": "Pineapple",
"year": "1967",
"rating": "5.7"
},
{
"name": "Apple",
"year": "1915",
"rating": "2.3"
},
{
"name": "Apple",
"year": "2014",
"rating": "3.7"
}
]
[
{
"name": "Apple",
"year": "2014",
"rating": "2.55"
}
]
[
{
"name": "APPLE",
"rating": "+4"
},
{
"name": "LEMON",
"rating": "+3"
}
]

当您在所有4个文件中搜索"Apple"时,您希望返回1个名称、1年和4个评级:

name: Apple (closest match to search term across all 4 files)
year: 2014 (the MOST COMMON year for Apple across first 3 JSONs)
rating:  21 (from JSON1)
3.7 (from JSON2)
2.55 (from JSON3)
+4 (from JSON4)

现在假设JSON3(或任何JSON(与"name:Apple"没有匹配。在这种情况下,改为返回以下内容。假设在至少一个文件中至少有一个匹配项。

name: Apple (closest match to search term across all 4 files)
year: 2014 (the MOST COMMON year for Apple across first 3 JSONs)
rating:  21 (from JSON1)
3.7 (from JSON2)
Not Found (from JSON3)
+4 (from JSON4)

如何在Python中获得此输出

这个问题类似于Python中的示例代码-获取两个Json文件的交集,只是有4个文件,其中1个文件缺少年份键,并且我们不需要评级值的交集。

到目前为止,我只为上面的两组JSON提供了以下内容:

import json
with open('1.json', 'r') as f:
json1 = json.load(f)
with open('2.json', 'r') as f:
json2 = json.load(f)
json2[0]['name'] = list(set(json2[0]['name']) - set(json1[0]['name']))
print(json.dumps(json2, indent=2))

我从中得到了输出,但它与我试图实现的目标不匹配。例如,这是输出的一部分:

{
"name": [
"a",
"n",
"i",
"P"
],
"year": "1967",
"rating": "5.7"
},

当您使用set构造函数创建集合时,它期望有一个可迭代的对象,并将迭代该对象的值以生成您的集合。因此,当你试图直接从字符串中制作一个集合时,你最终会得到

name = set('Apple')
# name = {'A', 'p', 'p', 'l', 'e'}

因为字符串是由字符组成的可迭代对象。相反,您希望将字符串包装成一个列表或元组,就像一样

name = set(['Apple'])
# name = {'Apple'}

在你的情况下看起来像

json2[0]['name'] = list(set([json2[0]['name']]) - set([json1[0]['name']]))

但我仍然不认为这真的是你想要实现的。相反,我建议您遍历每个json文件,创建自己的字典,该字典根据json文件中的名称进行索引。字典中的每个值都有另一个字典,字典中有两个关键字ratingyear,这两个关键字都有一个值列表。一旦你完成了词典的构建,你就会为每个名字列出一个等级和年份列表,然后你可以通过选择年份列表中最频繁的年份来将每个年份列表转换为一个值。下面是一个你的字典看起来像的例子

{
"Apple": { "rating": [21, 3.7, ...], "year": [1915, 2014, 2014] }
"Pineapple": ...
...
}

最新更新