【问题标题】:duplicates in a JSON file based on two attributes基于两个属性的 JSON 文件中的重复项
【发布时间】:2021-01-04 19:03:31
【问题描述】:

我有一个 JSON 文件,它是一个嵌套的 JSON。我想根据两个键删除重复项。

JSON 示例:

"books": [
{
            "id": "1",
            "story": {
                "title": "Lonely lion"
            },
            "description": [
                {
                    "release": false,
                    "author": [
                        {
                            "name": "John",
                            "main": 1
                        },
                        {
                            "name": "Jeroge",
                            "main": 0
                        },
                        {
                            "name": "Peter",
                            "main": 0
                        }
                    ]
                }
            ]
        },
    {
            "id": "2",
            "story": {
                "title": "Lonely lion"
            },
            "description": [
                {
                    "release": false,
                    "author": [
                        {
                            "name": "Jeroge",
                            "main": 1
                        },
                        {
                            "name": "Peter",
                            "main": 0
                        },
                        {
                            "name": "John",
                            "main": 0
                        }
                    ]
                }
            ]
        },
{
            "id": "3",
            "story": {
                "title": "Lonely lion"
            },
            "description": [
                {
                    "release": false,
                    "author": [
                        {
                            "name": "John",
                            "main": 1
                        },
                        {
                            "name": "Jeroge",
                            "main": 0
                        }
                        
                    ]
                }
            ]
        }
]

在这里我尝试匹配标题和作者姓名。例如,对于 id 1 和 id 2 是重复的(因为标题相同,作者姓名也相同(作者顺序无关紧要,无需考虑主要属性)。因此,在输出 JSON 中只有 id: 1 或 id:2 将保留 id:3。在最终输出中我需要两个文件。

Output_JSON:
"books": [
{
            "id": "1",
            "story": {
                "title": "Lonely lion"
            },
            "description": [
                {
                    "release": false,
                    "author": [
                        {
                            "name": "John",
                            "main": 1
                        },
                        {
                            "name": "Jeroge",
                            "main": 0
                        },
                        {
                            "name": "Peter",
                            "main": 0
                        }
                    ]
                }
            ]
        },
 
{
            "id": "3",
            "story": {
                "title": "Lonely lion"
            },
            "description": [
                {
                    "release": false,
                    "author": [
                        {
                            "name": "John",
                            "main": 1
                        },
                        {
                            "name": "Jeroge",
                            "main": 0
                        }

                    ]
                }
            ]
        }
]
duplicatedID.csv:

1-2

我尝试了以下方法,但结果不正确:

list= []
duplicate_Id = []
for data in (json_data['books'])[:]:   
    
    elements= []
    id = data['id']
    title = data['story']['title']
    elements.append(title)
    for i in (data['description'][0]['author']):
        name = (i['name'])
        elements.append(name)
    
   if not list:
        list.append(elements)
    
    
    else:
        for j in list:
            if set(elements) == set(j):
                duplicate_Id.append(id)
                elements = []
     

【问题讨论】:

  • 到目前为止你是如何解决这个问题的?

标签: python json python-3.x python-2.7


【解决方案1】:

总体思路是:

  • 获取由某些收集重复项的函数标识的组。
  • 然后返回每个组的第一个条目,确保没有重复。
  • 将关键函数定义为作者的排序列表和。根据定义,作者列表是唯一键,但可以以任何顺序出现。
import json
from itertools import groupby

j = json.load(books)


def transform(books):
    groups = [list(group) for _, group in groupby(books, key=getAuthors)]
    return [group[0] for group in groups]

def getAuthors(book):
    authors = book['description'][0]['author']
    return sorted([author['name'] for author in authors])

print(transform(j['books']))

如果我们想要获得重复数据,那么我们进行相同的计算,但返回任何带有length > 1 的子列表,因为这是我们定义的重复数据。

def transform(books):
    groups = [list(group) for _, group in groupby(books, key=getAuthors)]
    return [group for group in groups if len(group) > 1]

j['books'] 是您提供的包含在对象中的 JSON。

【讨论】:

  • 谢谢,是否可以得到相同的列表?例如这里 id 1 和 id 2 是相同的
  • 大多数事情都是可能的,这当然是。 groupby 将列表转换为列表列表,其中嵌套列表是按某个键分组的元素。在我们的例子中,该键是作者姓名的排序列表。查看修改后的答案@sanazz
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2013-04-16
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多