【问题标题】:Converting 3 column parent/child list into dictionary将 3 列父/子列表转换为字典
【发布时间】: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 字段是否属于 ChildParentParent-Child 组合?你为什么选择字典?
  • 数量与父子组合有关,这将是独一无二的,并给我适当的数量。有没有更好的方法而不是字典?当我创建层次结构时,我忽略了数量,我不确定如何将它保留在那里并且仍然得到我需要的树哦,是的,对不起,我复制了结果字典的最后几行。原始 CSV 有 80k 行的父子数量组合
  • 就导入SQL而言,这是可能的,我还没有研究过。您将如何使用外键来简化此操作?
  • 本练习的最终结果是将“平面” csv 文件转换为类似 csv 文件的树,这是字典的“tabified”树:i.imgur.com/SgJ2ms9.png

标签: python dictionary recursion


【解决方案1】:

您将需要一个辅助数据结构来跟踪与您要修改的叶子相对应的根节点。一个简单的选择是adjacency list。这样您就可以知道从哪个节点开始搜索。

或者(并且更简单),您可以实现 BFS/DFS,但数据中缺乏结构会导致时间复杂性较差。

【讨论】:

  • 我认为你是对的。我做了一些事情,我认为它使用邻接列表工作。如果可行,我将对其进行编辑,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2021-10-13
  • 2015-07-23
  • 1970-01-01
  • 2018-04-24
  • 2014-01-20
  • 2020-05-23
相关资源
最近更新 更多