【问题标题】:Get intersection of 4 JSON files based on 1-2 common key values? (Python)根据 1-2 个公共键值获取 4 个 JSON 文件的交集? (Python)
【发布时间】:2020-10-09 02:32:25
【问题描述】:

以下是 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)与“名称: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 - Getting the intersection of two Json-Files中的示例代码类似,除了有4个文件,1个文件缺少year键,我们不需要的交集评级键的值。

这是我目前所拥有的,仅针对上面的两组 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"
  },

【问题讨论】:

  • 您想要的输出有点抽象。你能根据输出的确切数据结构来指定吗?

标签: python json set-intersection


【解决方案1】:

当您使用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": ...
  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2012-04-12
    • 1970-01-01
    • 2017-07-22
    • 2021-12-03
    • 1970-01-01
    • 2022-08-02
    • 2021-01-23
    相关资源
    最近更新 更多