2016-05-16 63 views
1

我有一个在CSV结构这样的数据集:层次JSON

Name,code,count 
Adam,01,48 
Bill,01,32 
Chris,01,4 
Carl,01.01,5 
Dave,01.01,1 
David,01.01,1 
Eric,01.01.01,26 
Earl,01.01.01.01,2 
Frank,01.01.01.01,2 
Greg,01.01.01.02,2 
Harold,01.01.01.03,7 
Ian,01.01.01.03,3 
Jack,01.01.01.03,1 
John,01.01.01.04,10 
Kyle,01.01.01.04,2 
Larry,01.01.03.01,3 
Mike,01.01.03.01.01,45 
Nick,01.01.03.01.01.01,1 
Oliver,01.01.03.01.01.02,16 
Paul,01.01.03.01.01.03,23 

我想要一本字典在python里的“名”和“计数”是关键:值对(这很容易),但我想组织一个基于“代码”编号的层次结构。即01.01是01的孩子,我不知道如何迭代数据来实现这一点。我最终希望做一个整体结构的JSON转储,但是它是如何构造让我失望的层次结构。任何帮助是极大的赞赏。

+0

你能提供所需的输出的例子吗?你在开始时有三个'01'元素 - 01.01'元素应该如何适应层次结构?要分配给哪个元素? – iulian

+0

您可以显示“层级”的外观片段吗? –

+0

csv某些行上最多显示5个其他字段是什么? – martineau

回答

1

在Python实现树状结构的简单和优雅的方式使用递归defaultdict

import csv, json 
from collections import defaultdict 

def tree(): 
    return defaultdict(tree) 

d = tree() 

with open('data.txt', 'rb') as f: 
    reader = csv.reader(f, delimiter=',') 

    for name, code, count in list(reader)[1:]: 
     path = code.split('.') 
     iter_node = d 
     for node in path: 
      iter_node = iter_node[node] 
     iter_node['values'][name] = count 

print json.dumps(d, indent=2) 

{ 
    "01": { 
    "values": { 
     "Chris": "4", 
     "Bill": "32", 
     "Adam": "48" 
    }, 
    "01": { 
     "values": { 
     "Dave": "1", 
     "Carl": "5", 
     "David": "1" 
     }, 
     "03": { 
     "01": { 
      "01": { 
      "02": { 
       "values": { 
       "Oliver": "16" 
       } 
      }, 
      "03": { 
       "values": { 
       "Paul": "23" 
       } 
      }, 
      "01": { 
       "values": { 
       "Nick": "1" 
       } 
      }, 
      "values": { 
       "Mike": "45" 
      } 
      }, 
      "values": { 
      "Larry": "3" 
      } 
     } 
     }, 
     "01": { 
     "values": { 
      "Eric": "26" 
     }, 
     "02": { 
      "values": { 
      "Greg": "2" 
      } 
     }, 
     "03": { 
      "values": { 
      "Harold": "7", 
      "Ian": "3", 
      "Jack": "1" 
      } 
     }, 
     "01": { 
      "values": { 
      "Earl": "2", 
      "Frank": "2" 
      } 
     }, 
     "04": { 
      "values": { 
      "John": "10", 
      "Kyle": "2" 
      } 
     } 
     } 
    } 
    } 
} 
0

我想你想要做一些标准的树结构,在那里你可以访问一个树结构,缺少节点时自动创建一个路径访问。

就是这样。

class Node: 
    def __init__(self, parent=None): 
     self.parent = parent 
     self.store = {} 
     self.children = {} 

    def create_child(self, child_name): 
     self.children[ child_name ] = Node(self) 

    #ancestry_line is a list of names 
    def recursive_get_child(self, ancestry_line_names): 
     if len(ancestry_line_names) == 0: 
      return self 
     else: 
      next_ancestor = ancestry_line_names[0] 
      other_ancestors = ancestry_line_names[1:] 
      if next_ancestor not in self.children: 
       self.create_child(next_ancestor) 
      return self.children[ next_ancestor ].recursive_get_child(other_ancestors) 

你需要做的就是创建一个根节点,并通过路径访问正确的节点。

root = Node() 
for name, code, count in some_data_iterator(): 
    ancestry_line = code.split(".") 
    root.get(ancestry_line).store[ name ] = count 

然后可以在Node创建一个方法与节点结构转换为可用在json转储纯字典结构。

+0

感谢您的回复。这适用于一个小列表。只要我使用整个文件,我得到了“太大而无法解压”错误 – miltonjbradley

1

下面的代码片段找到了一棵树的所有节点,但实际上并没有创建它。 Python中的树和链表实现效率低下(Beazley)。

from itertools import groupby 
import csv 

with open('csvfile.csv') as f: 
    reader = csv.DictReader(f) 

groups = groupby(reader, key=lambda row: row['code']) 
nodes = {code: {item['Name']: item['count'] for item in group} for code,group in groups} 

{'01': {'Adam': '48', 'Bill': '32', 'Chris': '4'}, 
'01.01': {'Carl': '5', 'Dave': '1', 'David': '1'}, 
'01.01.01': {'Eric': '26'}, 
'01.01.01.01': {'Earl': '2', 'Frank': '2'}, 
'01.01.01.02': {'Greg': '2'}, 
'01.01.01.03': {'Harold': '7', 'Ian': '3', 'Jack': '1'}, 
'01.01.01.04': {'John': '10', 'Kyle': '2'}, 
'01.01.03.01': {'Larry': '3'}, 
'01.01.03.01.01': {'Mike': '45'}, 
'01.01.03.01.01.01': {'Nick': '1'}, 
'01.01.03.01.01.02': {'Oliver': '16'}, 
'01.01.03.01.01.03': {'Paul': '23'}} 
+0

感谢C熊猫!这很好。你可以编辑你的回应把这些行:import csv f = open(“somefile.csv”,“r”).....我想有些人会需要他们 – miltonjbradley

+0

@miltonjbradley哪行bdw? –

+0

我喜欢干净的代码。但是,它不会使树结构显式化。 – schwobaseggl