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