将3列父/子列表转换为字典

时间:2017-12-04 20:20:19

标签: python dictionary recursion

我有一个包含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

我想将其转换为字典,其中包括数量。

到目前为止,我可以使用以下代码制作dict:

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

结果dict看起来像这样:

 '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或更高的深度插入该数量?

这是Child Key及其许多父母的输出。

60542
['31280', '31281', '31280', '31281']
----------
61554
['31596', '31598', '31280', '31281', '31280', '31281']

1 个答案:

答案 0 :(得分:0)

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

或者(并且更简单),您可以实现BFS / DFS,但数据中缺少结构将确保时间复杂性差。