2013-08-02 74 views
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

不要命名你的列表'list'。 – wflynny

+1

详细阐述比尔的观点 - 这将覆盖名字空间中的内建列表类型。这不仅仅是一个风格问题。 –

+0

这同样不是一个好的形式来命名你的字典'字典'。 – lmjohns3

回答

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中,其中keysvaluesitems调用返回iterables而不是名单:

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

或者如果您不需要保存活动的顺序,请使用set进行活动。这是可取的,但不幸的是,Python不具备本地OrderedSet,所以我使用包含TrueOrderedDict近似于上面的代码。

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的字典收集有关的共享密钥的信息,并且保持每个代码活动的独特性。

+0

彼得很有帮助!因此,我尝试将data_dicts列表传递给此函数,并获取文件“/ private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397498141.629.py”,第229行,在 abilities_struct = add_abilities(abilities_m_l ) 返回[{o_code,activities.keys()} for o_code,活动in()中的文件“/ private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397498141.629.py”,第227行,add_abilities jobs_dict。iteritems()] TypeError:不可用类型:'list' – goldisfine

+0

我使用了错误的语法 - 应为o_code返回[{o_code:activities.keys()},jobs_dict.iteritems()中的活动''用逗号代替它看起来像一个集合文字,并且'activities.keys()'列表不能在一个集合中,因为它是一个不可分的类型。另外,我看到我的返回语句没有充分缩进 - 我将编辑以纠正。 –