【问题标题】:Remove duplicates from json data从 json 数据中删除重复项
【发布时间】:2013-06-09 04:56:07
【问题描述】:

有没有一种有效的方法可以使用 python 从该数据中删除重复的“person_id”字段?在这种情况下,只需保留第一次出现。

{
  {obj_id: 123,
    location: {
      x: 123,
      y: 323,
  },
  {obj_id: 13,
    location: {
      x: 23,
      y: 333,
  },
 {obj_id: 123,
    location: {
      x: 122,
      y: 133,
  },
}

应该变成:

{
  {obj_id: 123,
    location: {
      x: 123,
      y: 323,
  },
  {obj_id: 13,
    location: {
      x: 23,
      y: 333,
  },
}

【问题讨论】:

  • 这不是有效的 json。你能发布你的实际数据吗?
  • 另外,这些并不是真正的重复...

标签: python


【解决方案1】:

假设您的 JSON 是有效的语法,并且您确实在为 Python 请求帮助,您将需要执行类似的操作

import json
ds = json.loads(json_data_string) #this contains the json
unique_stuff = { each['obj_id'] : each for each in ds }.values()

如果你想始终保留第一次出现,你需要做这样的事情

all_ids = [ each['obj_id'] for each in ds ] # get 'ds' from above snippet
unique_stuff = [ ds[ all_ids.index(id) ] for id in set(ids) ]

【讨论】:

  • 假设,ds 是一个字典数组(因为这是最有意义的选项)这很好用,但保留最后一次出现而不是第一次出现。
  • +1:优雅(第一个例子)。尽管.values()/set() 可以按任何顺序返回对象。假设输入是 json 数组,那么它可能很重要。这是order preserving algorithm
  • micro-nitpick: objjson_array 可能比 eachds 更好的名字
  • json.loads(...)json.load(...)有什么区别?
  • @Sevenearths json.loads(...) 从字符串加载(加载:加载字符串); json.load(...) 从文件处理程序加载(或 read() 支持类文件对象)
【解决方案2】:

这是一个保留输入 json 对象顺序并保持具有相同 id 的对象的第一次出现的实现:

import json
import sys
from collections import OrderedDict

L = json.load(sys.stdin, object_pairs_hook=OrderedDict)
seen = OrderedDict()
for d in L:
    oid = d["obj_id"]
    if oid not in seen:
        seen[oid] = d

json.dump(seen.values(), sys.stdout,  indent=2)

输入

[
  {
    "obj_id": 123, 
    "location": {
      "x": 123, 
      "y": 323
    }
  }, 
  {
    "obj_id": 13, 
    "location": {
      "x": 23, 
      "y": 333
    }
  }, 
  {
    "obj_id": 123, 
    "location": {
      "x": 122, 
      "y": 133
    }
  }
]

Output

[
  {
    "obj_id": 123, 
    "location": {
      "x": 123, 
      "y": 323
    }
  }, 
  {
    "obj_id": 13, 
    "location": {
      "x": 23, 
      "y": 333
    }
  }
]

【讨论】:

    【解决方案3】:

    (如果你有有效的 json)

    from simplejson import loads, dumps
    dumps(loads(my_json))
    

    【讨论】:

    • 如果你不知道正确的输入是什么样的,你怎么知道它会做任何事情?
    • 问题标题是“Remove duplicates from json data”。我警告“如果有效的 json”并提供了答案。这也是问题中的其他人所做的。
    【解决方案4】:

    这不是有效的 JSON。在有效的 JSON(数组)上,您可以使用 jQuery $.each 并查看 Obj_id 来查找和删除重复项。

    类似这样的:

    $.each(myArrayOfObjects, function(i, v)
    {
          // check for duplicate and add non-repeatings to a new array
    });
    

    【讨论】:

    • 您错过了python 标签。并非世界上的所有事物都是 jQuery。
    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2017-06-09
    • 2019-06-22
    • 2021-07-24
    • 2016-05-16
    相关资源
    最近更新 更多