Python 不附加到列表中

Python 不附加到列表中,python,list,dictionary,Python,List,Dictionary,我试图创建一个字典列表,其中每个字典键都是一个作业,每个值都是一个与该作业关联的能力列表 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-

我试图创建一个字典列表,其中每个字典键都是一个作业,每个值都是一个与该作业关联的能力列表

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
例:

这是我正在处理的数据:

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
这就是我到目前为止所做的:

首先,我创建了一个字典列表,每个字典表示上面数据中的一行,其中keys=to column names,vals=column values。样本:

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-.....

换句话说,我的名单没有被填满

核心问题是您正在将
活动列表重新分配到
能力中每个字典的空列表中。因此,当您检测到更改的“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,其中
调用将返回iterables而不是列表:

    return [{o_code: list(activities.keys())} for o_code, activities in jobs_dict.items()]
或者,如果您不需要保留活动的顺序,请为活动使用
集合
。这是更可取的,但不幸的是Python没有本机的
OrderedSet
,因此我在上面用
OrderedDict
来近似它,其中包含为代码找到的活动的
True

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的字典收集有关共享键的信息,并保持每个代码的活动的唯一性。

不要给列表命名
list
。要详细说明Bill的观点,这会覆盖命名空间中的内置
list
类型。这不仅仅是一个风格问题。给字典命名也不是一个好的形式。谢谢大家。我以后不会这么懒了!非常有帮助的彼得!因此,我尝试将一个数据目录列表传递给这个函数,并获取文件“/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397498141.629.py”,第229行,在abilities\u struct=add_abilities(abilities\u m_l)文件“/private/var/folders/jv/9_sy0bn10mbdft1bk9t14;/T/T/T/Cleanup At Startup/bls-397498141.629.py”,第227行,在添加功能返回[{o_代码,activities.keys()}中,对于o_代码,作业中的活动[u dict.iteritems()]类型错误:不可损坏类型:“list”我使用了错误的语法-对于o_代码,应该是
返回[{o_代码:activities.keys()},对于作业中的活动[u dict.iteritems()]
,用逗号代替冒号,它看起来像一个集合文字,并且
activities.keys()
列表不能在集合中,因为它是不可损坏的类型。此外,我发现我的返回语句缩进不足——我也会编辑以纠正这一点。