2012-05-03 48 views
0

我有一个人名及其标题列表(mysql表格),如下表所示。我也有一个标题和他们的类别列表。我如何将他们的类别分配给这个人?当一个人有多个标题时会出现问题。将标题映射到类别并将其分配给该人的Python方法是什么?如何匹配和分配pythonic数据?

百姓餐桌

Name Title 
-------------------- 
John D CEO, COO, CTO 
Mary J COO, MD 
Tim C Dev Ops, Director 

标题类别表

Title  Executive IT Other 
----------------------------- 
CEO  1 
COO  1 
CTO  1   1 
MD   1 
Dev Ops    1 
Director     1 

所需的输出:

Name Title    Executive IT Other 
--------------------------------------------- 
John D CEO, COO, CTO  1   1 
Mary J COO, MD   1 
Tim C Dev Ops, Director   1 1 
+1

这将有助于看到你想要的输出应该是什么样子。 – thebjorn

+1

你的人员如何存储?一个类,一个字符串?这个问题太模糊了。 –

+0

还有哪里是标题和类别的列表? –

回答

1
name_title = (("John D",("CEO","COO","CTO")), 
       ("Mary J",("COO","MD")), 
       ("Tim C",("Dev Ops","Director"))) 
title_cat = {"CEO": set(["Executive"]), 
      "COO": set(["Executive"]), 
      "CTO": set(["Executive"]), 
      "MD": set(["Executive"]), 
      "Dev Ops": set(["IT"]), 
      "Director": set(["Other"])} 

name_cat = [(name, reduce(lambda x,y:x|y, [title_cat[title]for title in titles])) for name,titles in name_title] 

这将是很好,如果有一个union,其行为与集合上的sum相似。

+0

标题可以有2个类别或更多,在这种情况下,CTO有2个类别,IT和执行?这是一个小样本,我有几千个联系人!谢谢.... – ThinkCode

+1

是的,你可以做''CTO':set([“Executive”,“IT”])' –

+0

谢谢,请给它一个机会! – ThinkCode

2

开始在字典中,列出了形式安排您输入数据:

>>> name_to_titles = { 
     'John D': ['CEO', 'COO', 'CTO'], 
     'Mary J': ['COO', 'MD'], 
     'Tim C': ['Dev Ops', 'Director'] 
} 

然后循环输入字典创建反向映射:

>>> title_to_names = {} 
>>> for name, titles in name_to_titles.items(): 
     for title in titles: 
      title_to_names.setdefault(title, []).append(name) 

>>> import pprint 
>>> pprint.pprint(title_to_names) 
{'CEO': ['John D'], 
'COO': ['John D', 'Mary J'], 
'CTO': ['John D'], 
'Dev Ops': ['Tim C'], 
'Director': ['Tim C'], 
'MD': ['Mary J']} 
0

我提出这一点,如果你的意思是你有串:

s = '''Name Title 
-------------------- 
John D CEO, COO, CTO 
Mary J COO, MD 
Tim C Dev Ops, Director 

Title  Executive IT Other 
----------------------------- 
CEO  1 
COO  1 
CTO  1 
MD   1 
Dev Ops    1 
Director     1 
''' 

lines = s.split('\n') 
it = iter(lines) 

for line in it: 
    if line.startswith('Name'): 
     break 

next(it) # '--------------------' 

for line in it: 
    if not line: 
     break 
    split = line.split() 
    titles = split[2:] 
    name = split[:2] 
    print ' '.join(name), titles 

# John D ['CEO,', 'COO,', 'CTO'] 
# Mary J ['COO,', 'MD'] 
# Tim C ['Dev', 'Ops,', 'Director'] 
1
people=['john','Mary','Tim'] 
Title=[['CEO','COO','CTO'],['COO','MD'],['DevOps','Director']] 
title_des={'CEO':'Executive','COO':'Executive','CTO':'Executive', 
      'MD':'Executive','DevOps':'IT','Director':'Others' 
      } 
people_des={} 

for i,x in enumerate(people): 
    people_des[x]={} 
    for y in Title[i]: 
     if title_des[y] not in people_des[x]: 
      people_des[x][title_des[y]]=[y] 
     else:  
      people_des[x][title_des[y]].append(y) 
print(people_des)    

输出:

{'Tim': {'IT': ['DevOps'], 'Others': ['Director']}, 'john': {'Executive': ['CEO', 'COO', 'CTO']}, 'Mary': {'Executive': ['COO', 'MD']}} 
+0

谢谢,我会检查出来的! – ThinkCode