Python 为什么将密钥标识为值?

Python 为什么将密钥标识为值?,python,dictionary,Python,Dictionary,我正在用理解力编一本字典。该错误表示“我的密钥”存储为值而不是密钥 以下是全部情况: 我的BLS数据如下所示: 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.

我正在用理解力编一本字典。该错误表示“我的密钥”存储为值而不是密钥

以下是全部情况:

我的BLS数据如下所示:

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
并希望返回如下结构,每个作业都有详细的级别数据(作业由SOC代码表示,SOC代码是数据最左边的一列。例如,下面作业“职员”的SOC代码可能是11-1011.00)

为此,我在“我的能力”字段中创建了一个字典列表,并为每个能力创建一个级别(LV)和重要性(IM)数据列表

当我为IM/LV字典创建字典时,会标记错误

这是我的密码:

"""
Abilities
"""

# returns a list of dictionaries, each of the dictionaries representing a row in the data posted above with keys = top row and values = row vals.
abilities_m_l = create_abilities_master_list(file_list[0])    

# for each job (for each dictionary in the master list of job dictionaries)
for job in d_l:

    job_row = 1

    while job_row < 100: # just to test

        # initialize the list of abilities for the job
        job['abilities'] = []
        job['abilities'].append({abilities_m_l[job_row]['Element Name']:[]}) 

        while job['O*NET-SOC Code'] == abilities_m_l[job_row]['O*NET-SOC Code']:

            if abilities_m_l[job_row]['Element Name'] == abilities_m_l[job_row-1]['Element Name']:
                job[abilities_m_l[job_row]['Element Name']].append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})

            else:
                job[abilities_m_l[job_row]['Element Name']] = []
                job[abilities_m_l[job_row]['Element Name']].append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})

            job_row += 1   

    break           

for job in d_l:
    print job['abilities']
“”“
能力
"""
#返回字典列表,每个字典表示上面发布的数据中的一行,键=顶行,值=行VAL。
能力\u m\u l=创建能力\u主\u列表(文件\u列表[0])
#针对每个作业(针对作业词典主列表中的每个词典)
对于d_l的工作:
作业行=1
当作业行<100:#只是为了测试
#初始化作业的能力列表
工作['capabilities']=[]
作业['abilities'].append({abilities\u m_l[job\u row]['Element Name']:[]})
而作业['O*NET-SOC代码']==能力[job\u行]['O*NET-SOC代码']:
如果能力[job\u row]['Element Name']==能力[job\u row-1]['Element Name']:
作业[Ababilities_m_l[job_row]['Element Name']]]。追加({key:value for key,value in Ababilities_m_l[job_row],如果key不在('O*NET-SOC Code','Element Name','Scale ID'))
其他:
作业[能力作业行]['元素名称]]=[]
作业[Ababilities_m_l[job_row]['Element Name']]]。追加({key:value for key,value in Ababilities_m_l[job_row],如果key不在('O*NET-SOC Code','Element Name','Scale ID'))
作业行+=1
打破
对于d_l的工作:
打印作业[“能力”]
这是我的错误:

Traceback (most recent call last):
  File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397147690.633.py", line 65, in <module>
    job[abilities_m_l[job_row]['Element Name']].append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})
KeyError: 'Oral Comprehension'
logout
回溯(最近一次呼叫最后一次):
文件“/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/bls-397147690.633.py”,第65行,in
作业[Ababilities_m_l[job_row]['Element Name']]]。追加({key:value for key,value in Ababilities_m_l[job_row],如果key不在('O*NET-SOC Code','Element Name','Scale ID'))
关键错误:“口头理解”
注销

您正在测试列表是否存在错误:

if abilities_m_l[job_row]['Element Name'] == abilities_m_l[job_row-1]['Element Name']:
    job[abilities_m_l[job_row]['Element Name']].append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})
在这里,您假设仅仅因为前一行具有相同的元素名称,您就已经为该键添加了一个列表。显然,对于
口语理解
键,这种假设是错误的

只需测试密钥:

key = abilities_m_l[job_row]['Element Name']
if key not in job:
    job[key] = []
job[key].append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})
您还可以使用
dict.setdefault()
使其返回列表值,或者如果尚未设置键,则设置空列表值:

key = abilities_m_l[job_row]['Element Name']
job.setdefault(key, []).append({key:value for key,value in abilities_m_l[job_row] if key not in ('O*NET-SOC Code','Element Name', 'Scale ID')})
不能对不存在的键使用.append()append

考虑使用collections.defaultdict(这样不存在的键默认使用列表作为其值),或使用列表初始化函数[job\u row]['Element Name'],或'job'。其中一个正在尝试附加到一个不存在的键(如果该键不存在,则返回KeyError)

首先:

from collections import defaultdict

job=defaultdict(list)

这将确保键默认为空列表,并允许您的代码工作。

要么
job[abilities\m\u l[job\u row]['Element Name']
要么
abilities\m\u l[job\u row]
引发此异常,而不是理解。
from collections import defaultdict

job=defaultdict(list)