0

下の表に示すように、人物とその役職のリスト (mysql テーブル) があります。タイトルとそのカテゴリのリストもあります。個人にカテゴリを割り当てるにはどうすればよいですか? 一人の人に複数の役職がある場合に問題が発生します。タイトルをカテゴリにマッピングして人に割り当てる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
4

4 に答える 4

1

入力データをリストの辞書形式に配置することから始めます。

>>> 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']}
于 2012-05-03T19:47:36.603 に答える
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

于 2012-05-03T19:49:04.427 に答える
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']}}
于 2012-05-03T19:57:10.717 に答える
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']
于 2012-05-03T19:53:05.000 に答える