python - 删除与列表中的键对应的重复字典和排序值
问题描述
这是我之前遇到的问题的后续问题:递归访问嵌套字典的路径和值
考虑这个无意义的 JSON 文件,名为sample_dict
:https ://jsoneditoronline.org/?id=da7a486dc2e24bf8b94add9f04c71b4d
给定这里的代码:
import json
import csv
json_sample = 'sample_dict.json'
json_file = open(json_sample, 'r')
json_data = json.load(json_file)
csv_file = open('sample_dict.csv', 'w')
items = json_data['sample_dict']
# Thanks @fferri!
def visit_dict(d, path=[]):
for k, v in d.items():
if not isinstance(v, dict):
yield path + [k], v
else:
for visits in visit_dict(v, path + [k]):
yield visits
for key in items:
csv_file.write(','.join('/'.join(k) for k, v in visit_dict(key)))
csv_file.write('\n')
for value in items:
csv_file.write(','.join(str(v) for k, v in visit_dict(value)))
在这里,它打印出列表中的 2 个字典,包括重复的字典。有问题的问题是:
- 我们不希望重复,但包含父字典中的所有键和值,因为它们可能不存在于其他字典中
- 值乱序打印,不在行中,与列标题的键不匹配
理想的输出是这样的:
dict_id person person/person_id person/name person/age family family/person_id family/members family/members/father family/members/mother family/members/son family/family_id color items_id furniture furniture/type furniture/color furniture/size furniture/purchases
5 None 15 Martin 18 None 20 Jose Maddie Jerry 2 Red None None Chair Brown Large []
10 None 20 Zeeshan 25 None None None None None None None None None Table Blue Blue None []
请原谅格式错误,但每行中的每个值都应对应于每个列标题。
解决方案
我对 json 或 dicts 的工作不多,但我知道 dict 没有排序。如果您想要订单,则必须将键/值对移动到可排序的位置,然后对其进行排序。
我不太确定您所说的“重复”是什么意思
当您使用 csv 进行打印时,输出将以逗号分隔。如果要在列标题下打印值,则必须获取每个标题和每个值的长度,将单元格长度设置为较大的值,并在写入文件之前为较短的字符串添加填充。
重复
好的我明白了。我没有尝试通过列表理解来做到这一点,但使用循环很容易:
key_list = []
for key in items:
for k, v in visit_dict(key):
if k not in key_list: key_list.append(k)
然后,您可以遍历键列表以从项目中的每个键获取值。
推荐阅读
- sql-server - 违反主键约束 - SQL Server
- html - HTML5 视频 - 添加定位良好的按钮(图像)作为覆盖
- json - 写入 bzip2 存档
- php - PHP - 从句子中删除特定单词
- python - 如何使用 Telethon 向我的频道发送消息
- dbt - 自定义模式名称的宏不适用于 dbt 包
- ruby-on-rails - 是否可以使用与 form_for 相同的参数范围,除了 AJAX 调用?
- node.js - 带有 mern 堆栈的 socket.io 无法对未安装的组件执行 React 状态更新
- javascript - JS上页面加载数据的问题
- android - “KOTLIN”将 PDF 保存到 Media.Downloads 创建 0 字节的 pdf