基于1-2个公共键值获取4个JSON文件的交集?(Python)
下面是4个JSON文件:基于1-2个公共键值获取4个JSON文件的交集?(Python),python,json,set-intersection,Python,Json,Set Intersection,下面是4个JSON文件: 3个JSON文件有3个关键字段:名称、评级和年份 1 JSON只有2个关键字段:名称、评级(无年份) 在所有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 J
- 3个JSON文件有3个关键字段:名称、评级和年份
- 1 JSON只有2个关键字段:名称、评级(无年份)
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中获得此输出?
这个问题与中的示例代码类似,除了有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
构造函数创建一个集合时,它需要一个iterable对象,并将迭代该对象的值以生成集合。因此,当您试图直接从字符串创建一个集合时,您最终会得到
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文件中的名称编制索引。字典中的每个值都有另一个带有两个键的字典,rating
和year
,这两个键都有一个值列表。一旦你建立了字典,你会得到每个名字的等级和年份列表,然后你可以通过选择年份列表中最频繁的年份,将每个年份列表转换为一个值。
下面是一个你的字典可能看起来如何的例子
{
"Apple": { "rating": [21, 3.7, ...], "year": [1915, 2014, 2014] }
"Pineapple": ...
...
}
当您使用
set
构造函数创建一个集合时,它需要一个iterable对象,并将迭代该对象的值以生成集合。因此,当您试图直接从字符串创建一个集合时,您最终会得到
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文件中的名称编制索引。字典中的每个值都有另一个带有两个键的字典,rating
和year
,这两个键都有一个值列表。一旦你建立了字典,你会得到每个名字的等级和年份列表,然后你可以通过选择年份列表中最频繁的年份,将每个年份列表转换为一个值。
下面是一个你的字典可能看起来如何的例子
{
"Apple": { "rating": [21, 3.7, ...], "year": [1915, 2014, 2014] }
"Pineapple": ...
...
}
您想要的输出是抽象的。您可以指定输出的确切数据结构吗?您想要的输出有点抽象。您能否指定输出的确切数据结构?