【问题标题】:removing json items from array if value is duplicate python如果值重复 python 从数组中删除 json 项
【发布时间】:2016-03-28 07:56:18
【问题描述】:

我对 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 一样,控制台中没有显示任何内容。

【问题讨论】:

  • 请向我们展示您的无效代码,以便我们帮助您修复它。
  • @PM2Ring 我更新了我上面的问题

标签: python python-2.7


【解决方案1】:

您的方法可能有些过头了。我可能倾向于将列表重写为以“名称”为键的字典,然后获取值

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'}]

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

【讨论】:

  • 谢谢,我现在就试试。我也在试图弄清楚如何将 json 数据放入我正在编写代码的 python 文件中
  • @PaulFitzgerald:我以为你已经搞定了? ds = json.loads('python.json')
  • 我也这样做了,但我不认为它像我做 print ds 时那样工作,当我运行程序时,终端中没有任何显示,所以我认为它不工作。你能看出这段代码有什么问题吗?或者它是一个不会在终端中显示的 python 东西?
  • @PaulFitzgerald:json.loads 期望其字符串参数包含 JSON 数据,而不是文件名。有关从文件加载 JSON 的正确方法,请参阅 pkacprzak 的答案。
【解决方案2】:

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

一个简单的解决方案如下

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

【讨论】:

  • 谢谢,很好的解决方案
【解决方案3】:

首先,您的 json sn-p 格式无效 - 使用点而不是逗号分隔某些键。

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

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()

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2021-08-15
    • 2019-04-14
    • 2016-11-24
    • 2017-08-11
    • 1970-01-01
    • 2012-12-14
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多