我有一个名为detected_chems
的化学品名称小列表(<100)。
还有一个更大的可迭代对象,一个包含化学品名称作为键和化学品属性作为值的字典chem_db
。就像这样:
{'chemicalx':{'property1':'smells','property2':'poisonous'},
'chemicaly':{'property1':'stinks','property2':'toxic'}}
我正在尝试将检测到的所有化学物质与数据库中的物质进行匹配,并提取它们的属性。我已经研究了这些问题/答案,但似乎无法将其应用到我的情况中(抱歉)。
因此,我正在创建一个结果列表
res
,但是我没有使用嵌套的for循环和if x in
条件,而是创建了这个。
res = [{chem:chem_db[chem]}
for det_chem in detected_chems
for chem in chem_db.keys()
if det_chem in chem]
这在某种程度上是有效的!
我认为我在这里做的是创建一个字典列表,其中将具有化学名称(键)和关于化学物质的信息(作为值的字典本身)的键值对,如果检测到的化学物质在化学数据库(chem_db)中找到。
问题是,并非所有检测到的化学物质都能在数据库中找到。这 可能 是由于拼写错误或名称变化(例如,它们包含数字)或类似的原因。
因此,为了解决问题,我需要确定哪些被检测到的化学物质没有匹配成功。我认为这可能是一个解决方案:
not_matched=[]
res = [{chem:chem_db[chem]}
for det_chem in detected_chems
for chem in chem_db.keys()
if det_chem in chem else not_matched.append(det_chem)]
我遇到了语法错误,是由于else not_matched.append(det_chem)
这部分引起的。
我的两个问题:
1)为了避免语法错误,我应该把else条件放在哪里?
2)是否可以在列表推导式内部构建not_matched
列表,以便我不必先创建一个空列表。
res = [{chem:chem_db[chem]}
for det_chem in detected_chems
for chem in chem_db.keys()
if det_chem in chem else print(det_chem)]
我想要实现的是类似于以下内容:
in: len(detected_chems)
out: 20
in: len(res)
out: 18
in: len(not_matched)
out: 2
in: print(not_matched)
out: ['chemical_strange_character$$','chemical___WeirdSPELLING']
那会帮助我找到问题并解决匹配。