【问题标题】:Finding common value pair fields from numerous json in Python在 Python 中从众多 json 中查找公共值对字段
【发布时间】:2017-07-20 02:00:41
【问题描述】:

我有 JSON 文件的列表。现在我打算从所有这些 JSON 中找到所有公共值对并将其复制到不同的 JSON。此外,应该从所有 JSON 中删除公共值对。

假设我有a.jsonb.jsonc.json ... z.json

现在它们中的通用标签值对是

"Town" : "New York"

然后,这个公共元素应该被移动到一个名为 common.json 的新 JSON 文件中,并且该元素应该从所有 JSON 文件中删除。

例如 json 文件如下所示:

{
     "RepetitionTime": 2, 
     "EchoTime": 0,
     "MagneticFieldStrength": 3, 
     "SequenceVariant": "SK",
     "MRAcquisitionType": "2D",
     "FlipAngle": 90,
     "ScanOptions": "FS",
     "SliceTiming": [[0.0025000000000000022], [0.5], [-0.030000000000000027], [0.46625], [-0.06374999999999997], [0.43375000000999997], [-0.09624999999999995], [0.40000000001], [-0.12999999999], [0.36750000001], [-0.16249999998999998], [0.333750000005], [-0.19624999999500004], [0.301250000005], [-0.228749999995], [0.26749999999999996], [-0.26249999999500007], [0.235], [-0.29500000000000004], [0.20124999999999998], [-0.32875], [0.16875000001], [-0.36124999999999996], [0.13500000001], [-0.39499999999], [0.10250000000999998], [-0.42749999999], [0.06875000000499998], [-0.46124999999500005], [0.036250000005000005]],
     "SequenceName": "epfid2d1_64",
     "ManufacturerModelName": "TrioTim",
      "TaskName": "dis",
    "ScanningSequence": "EP",
      "Manufacturer": "SIEMENS"
}

我的想法太复杂了。我想取每一行和第一个 json 文件并检查所有其他 json。

应该有一些简单而有效的东西。有什么指点吗?

【问题讨论】:

  • json 可以保存 json-objects 和 json-arrays 的任意嵌套/结构化组合。如果您不让我们了解您的 json 文件是什么样的,那么没有人可以帮助您。另外,这不是代码编写服务。你需要展示你自己的尝试,以及它们是如何失败的,以及你可能做过的任何其他研究。
  • 你能告诉我们JSON的结构吗?相同的 json 文件应该是相同的结构。那就是你能期望“Town”出现在所有文件中吗?

标签: python json dictionary


【解决方案1】:

要一次比较所有文件,您还可以使用Sets 使用& 一次比较所有键值

>>> import json

>>> json_dict1 = json.loads('{"a":1, "b":2}')
>>> json_dict2 = json.loads('{"a":1, "b":4, "c":5}')
>>> json_dict3 = json.loads('{"a":1, "b":2, "c":5}')

>>> a = set(json_dict1.items())
>>> b = set(json_dict2.items())
>>> c = set(json_dict3.items())
>>> a & b & c
{('a', 1)}

请注意,您还可以使用Sets 进行其他操作,这里是文档中的示例:

>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b                              # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # letters in both a and b
{'a', 'c'}
>>> a ^ b                              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}

编辑

最后,我问了我自己的so question,基于和你一样的问题(几乎)。

这里是最好的response

如果你懒得点击链接,这里有一个概述:

>>> list_dict = [json_dict1, json_dict2, json_dict3]
>>> {k: v
     for k, v in list_dict[0].items()
     if all(k in d and d[k] == v
            for d in list_dict[1:])}
{'a': 1}

【讨论】:

  • 如果字典有 list,我的 anwser 将不起作用,因为它会抛出 TypeError: unhashable type: 'list'。明天我会删除这个答案,请不要同时投反对票^^'
  • 根据上面共享的 json 示例,一个或多个值对是列表。例如:"SliceTiming".. 在这种情况下它有效吗?
  • 不幸的是,它没有。您可以通过手动删除"SliceTiming" 或将其转换为string 来找到解决方法。但它远非完美!如果我设法解决这个问题,我会告诉你。在那之前我认为@Haifeng 的解决方案是最好的
【解决方案2】:

由于您没有提供确切的 JSON 样本,我认为它只是常规的 json,如 '{"key":"value"}'。

将json字符串转换为字典:

import json
json_dict = json.loads('{"a":1, "b":2}')  # converts json string to dictionary

现在假设我们有两个转换后的字典:

>>> dict1= {"a":1,"b":2}
>>> dict2= {"a":1,"b":3}

比较两个字典并找到共同的键值对(类似于 diff k-v 对),我使用的是 python3:

>>> {k:v  for k, v in dict1.items()  for k1,v1 in dict2.items() if k ==k1 and v==v1}
{'a': 1}

我的帖子向您展示了如何解决您的问题的想法,它可能对您的特定 JSON 行存在边缘问题,您可以对其进行修改并满足您的需求。希望对你有帮助

【讨论】:

  • @downvoter 请发表评论,我会改进我的答案
  • 这里的问题是我可以只用 json.loads('pathtofile') 加载 json 文件。我必须将 json 文件作为某个对象打开,然后再打开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2010-09-15
  • 2013-02-27
  • 2015-06-28
  • 2012-04-12
  • 2011-07-15
相关资源
最近更新 更多