从Python

时间:2017-02-28 22:28:40

标签: python json dictionary

我有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文件并检查所有其他jsons。

应该有一些简单而有效的方法。任何指针?

2 个答案:

答案 0 :(得分:2)

要一次比较所有文件,您还可以使用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'} 执行其他操作,此处是doc:

中的示例
>>> 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}

修改

最后,我根据与你(差不多)相同的问题问自己的so question

这是最好的response

如果您懒得点击链接,请参阅以下内容:

{ "x":"a", "x":"b" }

答案 1 :(得分:1)

由于您没有提供完整的JSON样本,我认为它只是常规的json,因为' {" key":" value"}&#39 ;。

将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行产生边缘问题,您可以修改它并满足您的需求。希望它有所帮助