根据字典设置层次结构

时间:2018-12-20 15:25:59

标签: python dictionary hierarchy

我有一个员工的CSV文件,其中有员工数据,包括姓名,老板,部门ID和部门名称。 通过读取该CSV文件,我创建了这2个dict结构:

dep = {}
dep[1] = {'name': 'Sales', 'parent': None}
dep[2] = {'name': 'National Sales', 'parent': None}
dep[3] = {'name': 'International Sales', 'parent': None}
dep[4] = {'name': 'IT', 'parent': None}
dep[5] = {'name': 'Development', 'parent': None}
dep[6] = {'name': 'Support', 'parent': None}
dep[7] = {'name': 'Helpdesk', 'parent': None}
dep[8] = {'name': 'Desktop support', 'parent': None}
dep[9] = {'name': 'CEO', 'parent': None}

emp = {}
emp[1] = {'name': 'John', 'boss': None, 'dep': 9}
emp[2] = {'name': 'Jane', 'boss': 1, 'dep': 1}
emp[3] = {'name': 'Bob', 'boss': 2, 'dep': 1}
emp[4] = {'name': 'Clara', 'boss': 2, 'dep': 2}
emp[5] = {'name': 'George', 'boss': 3, 'dep': 2}
emp[6] = {'name': 'Steve', 'boss': 2, 'dep': 3}
emp[7] = {'name': 'Joe', 'boss': 1, 'dep': 4}
emp[8] = {'name': 'Peter', 'boss': 7, 'dep': 5}
emp[9] = {'name': 'Silvia', 'boss': 7, 'dep': 6}
emp[10] = {'name': 'Mike', 'boss': 9, 'dep': 7}
emp[11] = {'name': 'Lukas', 'boss': 10, 'dep': 7}
emp[12] = {'name': 'Attila', 'boss': 7, 'dep': 8}
emp[13] = {'name': 'Eva', 'boss': 12, 'dep': 8}

除此之外,我还有2个任务:

  1. 创建部门的层次结构。 (基本上填入 父键)
  2. 显示(列出)老板的所有部门和员工

第2点的预期结果是(每个从事销售工作的人):

employees = {1: (2, 3, 4, 5, 6)}

针对在全国销售部门工作的每个人:

employees = {4: (5)}

对于从事国际销售的每个人(史蒂夫是唯一的人,没有人为他工作):

employees = {6: None}

如何以高效的方式实现这一目标(我必须处理数千名员工)?

编辑: 这是一个(简化的)CSV文件结构:

id;name;boss;dep_id;dep_name
    1;John;;9;CEO
    2;Jane;1;1;Sales
    3;Bob;2;1;Sales
    4;Clara;2;2;National Sales
    5;George;3;2;National Sales
    6;Steve;2;3;International Sales
    7;Joe;1;4;IT
    8;Peter;7;5;Development
    9;Silvia;7;6;Support
    10;Mike;9;7;Helpdesk
    11;Lukas;10;7;Helpdesk
    12;Attila;7;8;Desktop support
    13;Eva;12;8;Desktop support

1 个答案:

答案 0 :(得分:0)

如评论中所建议,这是使用熊猫的解决方案。该文件使用您的示例数据进行了模拟,对于只有几千个条目的文件来说应该足够快。

from StringIO import StringIO
import pandas as pd

f = StringIO("""
id;name;boss;dep_id;dep_name
1;John;1;9;CEO
2;Jane;1;1;Sales
3;Bob;2;1;Sales
4;Clara;2;2;National Sales
5;George;3;2;National Sales
6;Steve;2;3;International Sales
7;Joe;1;4;IT
8;Peter;7;5;Development
9;Silvia;7;6;Support
10;Mike;9;7;Helpdesk
11;Lukas;10;7;Helpdesk
12;Attila;7;8;Desktop support
13;Eva;12;8;Desktop support
""")

# load data
employees = pd.read_csv(f, sep=';', index_col=0)

### print a department ###
# Filter by department and print the names
print employees[employees.dep_id == 7].name

### build org hierarchy ###
# keep only one entry per department (assumes they share a boss)
org = employees[['boss', 'dep_id']].drop_duplicates('dep_id')
# follow the boss id to their department id
# note: the CEO is his own boss, to avoid special casing
org['parent'] = org.dep_id.loc[org['boss']].values
# reindex by department id, and keep only the parent column
# note: the index is like your dictionary key, access is optimized
org = org.set_index('dep_id')[['parent']]
print org