【发布时间】:2018-05-18 09:20:01
【问题描述】:
我有一个包含 3 列的大型 csv 文件:
Parent Child Qty
31282 42126A 0.00272
31282 50553 0.107
31282 61119 1
31283 42126A 0.00272
31283 50277 0.107
31283 61119 1
一个孩子可以是其他孩子的父母。
可能会有两个相同的孩子有不同的父母,因此数量也不同:
31254 31282 0.535
31255 31282 2.8448
我想把它转换成字典,包括数量。
到目前为止,我可以使用以下代码制作字典:
has_parent = set()
all_items = {}
quan = []
for parent, child, qty in data:
if parent not in all_items:
all_items[parent] = {}
if child not in all_items:
all_items[child] = {}
quan.append({'parent': parent,'child': child, 'qty': qty})
all_items[parent][child] = all_items[child]
has_parent.add(child)
result = {}
for key, value in all_items.items():
if key not in has_parent:
result[key] = value
结果字典如下所示:
'31597': {'31598': {'42126A': {},
'50005A': {},
'50365': {},
'50393': {},
'53120': {},
'61554': {}}},
'31599': {'31600': {'50398': {}}},
'31601': {'31602': {'50399': {}}},
'31603': {'31600': {'50398': {}}},
'31604': {'31602': {'50399': {}}},
'31605': {'31606': {'50403': {}}},
'31607': {'31606': {'50403': {}}},
'31609': {'31608': {'51037': {}, '52095': {}, '64041': {}}},
'31612': {'31610': {'40098': {}, '60544': {}, '61501A': {}}},
我的问题是如何将 QTY 插入正确的键中。
我可以找到密钥的父母,然后查看原始文件并查看数量,但我如何才能将该数量插入 3 或 4 或更多的深度?
这是子键及其许多父键的输出。
60542
['31280', '31281', '31280', '31281']
----------
61554
['31596', '31598', '31280', '31281', '31280', '31281']
【问题讨论】:
-
您是否有不想将此数据导出到 sql 数据库设置样式的原因?获得外键访问权限将使这个问题变得微不足道。
-
您的结果字典包含示例 csv 输入中没有的信息 - 很难将两者关联起来。
QTY字段是否属于Child、Parent或Parent-Child组合?你为什么选择字典? -
数量与父子组合有关,这将是独一无二的,并给我适当的数量。有没有更好的方法而不是字典?当我创建层次结构时,我忽略了数量,我不确定如何将它保留在那里并且仍然得到我需要的树哦,是的,对不起,我复制了结果字典的最后几行。原始 CSV 有 80k 行的父子数量组合
-
就导入SQL而言,这是可能的,我还没有研究过。您将如何使用外键来简化此操作?
-
本练习的最终结果是将“平面” csv 文件转换为类似 csv 文件的树,这是字典的“tabified”树:i.imgur.com/SgJ2ms9.png
标签: python dictionary recursion