如何在Python中统计多段JSON数据中的重复值
如何在Python中统计多段JSON数据中的重复值
嘿,我来帮你搞定这个多段JSON重复值统计的问题!从你给出的示例和代码片段来看,你的数据是每行一个独立的JSON对象(不是标准的JSON数组),我们可以基于这个特点来完善代码,实现不同维度的重复值统计。
先看你的JSON数据示例:
{"authors":[{"ids":["4888852"],"name":"Andrea D. Foebel"},{"ids":["3325893"],"name":"John P. Hirdes"},{"ids":["5316482"],"name":"George A. Heckman"}]} {"authors":[{"ids":["4836831"],"name":"A. S. Gavrish"},{"ids":["4061357"],"name":"E. N. Kilimnik"}]} {"authors":[{"ids":["4888852"],"name":"A. S. Gavrish"},{"ids":["4061357"],"name":"E. N. Kilimnik"}]}
你的已有代码片段(我帮你补全了读取逻辑):
import csv import json import pandas as pd from itertools import islice from collections import Counter data = [] # 逐行读取多段JSON文件(每行一个独立JSON对象) with open('your_data.json', 'r') as f: for line in f: # 跳过空行,解析有效JSON line = line.strip() if not line: continue try: obj = json.loads(line) data.append(obj) except json.JSONDecodeError as e: print(f"跳过无效JSON行: {line},错误信息: {e}")
接下来是几种常见的统计需求实现:
1. 统计重复的作者ID(忽略名字差异)
如果你的核心需求是找出重复出现的作者ID(比如示例中4888852出现了两次),可以用下面的代码:
# 提取所有作者的ID(假设每个作者的ids数组只有一个元素) all_author_ids = [] for entry in data: for author in entry['authors']: author_id = author['ids'][0] all_author_ids.append(author_id) # 用Counter统计重复ID id_count = Counter(all_author_ids) print("=== 重复作者ID统计 ===") for author_id, count in id_count.items(): if count > 1: print(f"ID {author_id} 共出现 {count} 次")
2. 统计重复的作者名字(忽略ID差异)
如果想找出重名的作者,不管ID是否相同,可以这样做:
# 提取所有作者名字 all_author_names = [] for entry in data: for author in entry['authors']: all_author_names.append(author['name']) name_count = Counter(all_author_names) print("\n=== 重复作者名字统计 ===") for name, count in name_count.items(): if count > 1: print(f"名字 '{name}' 共出现 {count} 次")
3. 统计完全匹配的作者条目(ID和名字都一致)
如果要找出ID和名字完全相同的重复作者,可以把每个作者的信息转成元组再统计:
# 提取所有作者的(ID, 名字)元组 author_identifiers = [] for entry in data: for author in entry['authors']: author_tuple = (author['ids'][0], author['name']) author_identifiers.append(author_tuple) full_match_count = Counter(author_identifiers) print("\n=== 完全匹配的作者条目统计 ===") for (author_id, name), count in full_match_count.items(): if count > 1: print(f"作者(ID: {author_id}, 名字: {name}) 共出现 {count} 次")
4. 额外:找出同一ID对应不同名字的异常情况
从你的示例里能看到4888852这个ID对应了两个不同的名字,如果你想排查这种不一致的情况,可以用这个代码:
# 用字典记录每个ID对应的所有名字 id_name_map = {} for entry in data: for author in entry['authors']: author_id = author['ids'][0] name = author['name'] if author_id not in id_name_map: id_name_map[author_id] = set() id_name_map[author_id].add(name) print("\n=== 同一ID对应多个名字的异常情况 ===") for author_id, names in id_name_map.items(): if len(names) > 1: print(f"ID {author_id} 关联的名字有: {', '.join(names)}")
这些代码都是基于你给出的依赖库(Counter是关键工具)来实现的,你可以根据自己的实际需求选择对应的统计逻辑。如果你的JSON数据格式有变化(比如一个作者有多个ID),只需要稍微调整提取字段的逻辑就可以啦。
内容的提问来源于stack exchange,提问作者keavy
相关产品推荐
相关产品推荐

