Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于1-2个公共键值获取4个JSON文件的交集?(Python)_Python_Json_Set Intersection - Fatal编程技术网

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

基于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

下面是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 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": ...
  ...
}

您想要的输出是抽象的。您可以指定输出的确切数据结构吗?您想要的输出有点抽象。您能否指定输出的确切数据结构?