如果值是重复的python,则从数组中删除json项

时间:2016-03-28 07:56:18

标签: python python-2.7

我对python非常陌生。

我有一个充满json对象的数组。一些json对象包含重复的值。该数组如下所示:

 [{"id":"1","name":"Paul","age":"21"},
  {"id":"2","name":"Peter","age":"22"},
  {"id":"3","name":"Paul","age":"23"}]

我想要做的是,如果name与另一个json对象相同,则删除一个项目,并将第一个保留在数组中。

所以在这种情况下我应该留下

  [{"id":"1"."name":"Paul","age":"21"},
  {"id":"2","name":"Peter","age":"22"}]

我目前拥有的代码可以在下面看到,主要是based on this answer

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

all_ids = [ each['name'] for each in ds ]
unique_stuff = [ ds[ all_ids.index(text) ] for text in set(texts) ]

print unique_stuff

我甚至不确定此行是否正常ds = json.loads('python.json') #this file contains the json,因为当我尝试并且print ds没有任何内容出现在控制台中时。

3 个答案:

答案 0 :(得分:3)

你的方法可能过头了。我可能倾向于将列表重写为带有“name”作为键的字典,然后获取值

ds = [{"id":"1","name":"Paul","age":"21"},
  {"id":"2","name":"Peter","age":"22"},
  {"id":"3","name":"Paul","age":"23"}]

{elem["name"]:elem for elem in ds}.values()
Out[2]: 
[{'age': '23', 'id': '3', 'name': 'Paul'},
 {'age': '22', 'id': '2', 'name': 'Peter'}]

当然,字典和列表中的项目可能没有订购,但我没有看到太多问题。如果是,请告诉我们,我们可以考虑一下。

答案 1 :(得分:3)

如果您需要在数据中保留"Paul"的第一个实例,字典理解会给您带来相反的结果。

一个简单的解决方案可以如下

new = []
seen = set()
for record in old:
    name = record['name']
    if name not in seen:
        seen.add(name)
        new.append(record)
del seen

答案 2 :(得分:1)

首先,你的json片段格式无效 - 有点而不是逗号分隔某些键。

您可以使用名称为键的词典来解决您的问题:

import json

with open('python.json') as fp:
    ds = json.load(fp) #this file contains the json

    mem = {}

    for record in ds:
        name = record["name"]
        if name not in mem:
            mem[name] = record

    print mem.values()