2012-05-03 49 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