0

各辞書キーがジョブであり、各値がそのジョブに関連付けられた能力のリストである辞書のリストを作成しようとしています。

元:

[{'clerk': ['math ability','writing ability',...etc]},{'salesman':['charisma','writing ability','etc']}]

これは私が扱っているデータです:

O*NET-SOC Code  Element ID  Element Name    Scale ID    Data Value  N   Standard Error  Lower CI Bound  Upper CI Bound  Recommend Suppress  Not Relevant    Date    Domain Source
11-1011.00  1.A.1.a.1   Oral Comprehension  IM  4.5 8   0.19    4.13    4.87    N   n/a Jun-06  Analyst
11-1011.00  1.A.1.a.1   Oral Comprehension  LV  4.75    8   0.25    4.26    5.24    N   N   Jun-06  Analyst
11-1011.00  1.A.1.a.2   Written Comprehension   IM  4.38    8   0.18    4.02    4.73    N   n/a Jun-06  Analyst

そして、これは私がこれまでに行ったことです:

最初に辞書のリストを作成します。各辞書は、上記のデータの行をキー = 列名と vals = 列値で表します。サンプル:

OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.19'), ('Element ID', '1.A.1.a.1'), ('N', '8'), ('Scale ID', 'IM'), ('Not Relevant', 'n/a'), ('Element Name', 'Oral Comprehension'), ('Lower CI Bound', '4.13'), ('Date', '06/2006'), ('Data Value', '4.50'), ('Upper CI Bound', '4.87'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.25'), ('Element ID', '1.A.1.a.1'), ('N', '8'), ('Scale ID', 'LV'), ('Not Relevant', 'N'), ('Element Name', 'Oral Comprehension'), ('Lower CI Bound', '4.26'), ('Date', '06/2006'), ('Data Value', '4.75'), ('Upper CI Bound', '5.24'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.18'), ('Element ID', '1.A.1.a.2'), ('N', '8'), ('Scale ID', 'IM'), ('Not Relevant', 'n/a'), ('Element Name', 'Written Comprehension'), ('Lower CI Bound', '4.02'), ('Date', '06/2006'), ('Data Value', '4.38'), ('Upper CI Bound', '4.73'), ('O*NET-SOC Code', '11-1011.00')]), OrderedDict([('Domain Source', 'Analyst'), ('Recommend Suppress', 'N'), ('Standard Error', '0.32'), ('Element ID', '1.A.1.a.2'), ('N', '8'), ('Scale ID', 'LV'),

次に、各キーがジョブ コードで、各値がそのジョブに関連付けられた能力のリストである少数のディクショナリに辞書をマージしようとしました。

def add_abilites(abilites_m_l):
    jobs_list = []
    for ind, dict in enumerate(abilites_m_l):
        activities_list = []
        if abilities_m_l[ind-1]['O*NET-SOC Code'] == abilities_m_l[ind]['O*NET-SOC Code']: 
            if abilities_m_l[ind]['Element Name'] != abilities_m_l[ind-1]['Element Name']:
                activities_list.append(abilities_m_l[ind]['Element Name'])
            else: pass
        else: list.append({abilities_m_l[ind]['O*NET-SOC Code']:activities_list})        
    return jobs_list
a_l_with_abilities = add_abilites(abilities_m_l)
print a_l_with_abilities

次の出力が得られます。

[{'11-1011.00': []}, {'11-1021.00': []}, {'11-2011.00': []}, {'11-2021.00': []}, {'11-2022.00': []}, {'11-2031.00': []}, {'11-3011.00': []}, {'11-3021.00': []}, {'11-3031.01': []}, {'11-3031.02': []}, {'11-3051.00': []}, {'11-3051.01': []}, {'11-3051.02': []}, {'11-3051.04': []}, {'11-3061.00': []}, {'11-3071.01': []}, {'11-3071.02': []}, {'11-3071.03': []}, {'11-3111.00': []}, {'11-3121.00': []}, {'11-3131.00': []}, {'11-9013.01': []}, {'11-9013.03': []}, {'11-9021.00': []}, {'11-9031.00': []}, {'11-9032.00': []}, {'11-9033.00': []}, {'11-9041.00': []}, {'11-.....

言い換えれば、私のリストは埋まっていません。

4

1 に答える 1

1

核となる問題は、activities_listの各辞書の空のリストに再割り当てしていることですabilities_m_l。したがって、変更された「O*NET-SOC コード」値を検出すると、再割り当てしたばかりの空のリストを追加します。

これを行うためのよりクリーンな方法を次に示します。

def add_abilities(abilities_m_l):
    jobs_dict = OrderedDict()
    for data_dict in abilities_m_l:
        o_code = data_dict['O*NET-SOC Code']
        activity = data_dict['Element Name']
        activities_so_far = jobs_dict.setdefault(o_code, OrderedDict())
        activities_so_far[activity] = True
    return [{o_code: activities.keys()} for o_code, activities in jobs_dict.iteritems()]

または、Python 3 を使用している場合、keys,valuesおよびのitems呼び出しはリストではなく iterable を返します。

    return [{o_code: list(activities.keys())} for o_code, activities in jobs_dict.items()]

または、保持されるアクティビティの順序が必要ない場合は、アクティビティに asetを使用します。それが望ましいのですが、残念ながら Python にはネイティブがないため、コードで見つかったアクティビティを含むOrderedSetもので近似しました。OrderedDictTrue

def add_abilities(abilities_m_l):
    jobs_dict = OrderedDict()
    for data_dict in abilities_m_l:
        o_code = data_dict['O*NET-SOC Code']
        activity = data_dict['Element Name']
        activities_so_far = jobs_dict.setdefault(o_code, set)
        activities_so_far.add(activity)
    return [{o_code: list(activities)} for o_code, activities in jobs_dict.iteritems()]

重要なのは、Python の辞書に共有キーに関する情報を収集させ、各コードのアクティビティの一意性を維持することです。

于 2013-08-02T18:55:13.687 に答える