字典键匹配拼接值问题:处理字典元素数量不一致场景
解决字典键匹配拼接URL的问题
你的问题核心出在列表推导式的判断条件上:if database_dict.keys() == cross_ref_dict.keys()这个条件只有当两个字典的所有键完全一致时才会成立,而题目里明确说明database_dict的元素数量始终多于cross_ref_dict,所以这个条件几乎永远不满足,自然返回空列表。
要实现「仅在键匹配时拼接值,只保留database_dict中存在匹配键的结果」,我们只需要聚焦于cross_ref_dict里的键(因为我们只关心有交叉引用的条目),检查这些键是否在database_dict中存在,再进行值的拼接即可。
修改后的代码如下:
database_dict = { 'CLO' : 'https://www.ebi.ac.uk/ols/ontologies/clo/terms?iri=http://purl.obolibrary.org/obo/', 'EFO' : ' https://www.ebi.ac.uk/efo/', 'ArrayExpress' : 'https://www.ebi.ac.uk/arrayexpress/experiments/', 'ATCC' : 'https://www.atcc.org/Products/All/', # + .aspx 'BioSample' : 'https://www.ncbi.nlm.nih.gov/biosample/?term=', 'CCLE' : 'https://portals.broadinstitute.org/ccle/page?cell_line=', 'Cell_Model_Passport' : 'https://cellmodelpassports.sanger.ac.uk/passports/', 'ChEMBL-Cells' : 'https://www.ebi.ac.uk/chembldb/cell/inspect/', 'ChEMBL-Targets' : 'https://www.ebi.ac.uk/chembldb/target/inspect/', 'Cosmic' : 'https://cancer.sanger.ac.uk/cosmic/sample/overview?id=', 'Cosmic-CLP' : 'https://cancer.sanger.ac.uk/cell_lines/sample/overview?id=', 'DepMap' : 'https://depmap.org/portal/cell_line/ACH-000830', 'GDSC' : 'https://www.cancerrxgene.org/translation/CellLine/', 'GEO' : 'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=', 'IARC_TP53' : 'https://p53.iarc.fr/CellLines.aspx', 'IGRhCellID' : 'http://igrcid.ibms.sinica.edu.tw/cgi-bin/cell_line_view.cgi?cl_name=', 'KCLB' : 'https://cellbank.snu.ac.kr/english/sub/catalog.php?page=detail&CatNo=59&strQ=', # + &submit1=Find+it 'LiGeA' : 'http://hpc-bioinformatics.cineca.it/fusion/cell_line/', 'LINCS_LDP' : 'http://lincsportal.ccs.miami.edu/cells/#/view/', 'PharmacoDB' : 'https://pharmacodb.ca/cell_lines/', 'PRIDE' : 'https://www.ebi.ac.uk/pride/archive/projects/', 'Wikidata' : 'https://www.wikidata.org/wiki/', 'test' : 'test', 'test2' : 'test2' } cross_ref_dict = {'CLO': 'CLO_0007996', 'EFO': 'EFO_0002253', 'ArrayExpress': 'E-MTAB-3610', 'ATCC': 'CRL-5871', 'BioSample': 'SAMN10988000', 'CCLE': 'NCIH1436_LUNG', 'Cell_Model_Passport': 'SIDM00697', 'ChEMBL-Cells': 'CHEMBL3308893', 'ChEMBL-Targets': 'CHEMBL2366205', 'Cosmic': '2125229', 'Cosmic-CLP': '908469', 'DepMap': 'ACH-000830', 'GDSC': '908469', 'GEO': 'GSM1682805', 'IARC_TP53': '21539', 'IGRhCellID': 'NCIH1436', 'KCLB': '91436', 'LiGeA': 'CCLE_790', 'LINCS_LDP': 'LCL-1838', 'PharmacoDB': 'NCIH1436_1017_2019', 'PRIDE': 'PXD011896', 'Wikidata': 'Q54907807'} # 修改后的列表推导式 key_values['Cross-ref'] = [ database_dict[k] + cross_ref_dict[k] for k in cross_ref_dict if k in database_dict # 确保database_dict中存在该键,避免KeyError ]
关键修改说明:
- 遍历对象改为
cross_ref_dict:我们只需要处理有交叉引用的条目,不需要管database_dict里额外的键。 - 判断条件改为
if k in database_dict:检查当前键是否存在于database_dict中,只有匹配时才执行拼接。 - 去掉冗余的
str()转换:两个字典的值本身都是字符串类型,直接拼接即可。
这样修改后,无论database_dict比cross_ref_dict多多少键,最终只会返回那些在cross_ref_dict中存在、且在database_dict里能找到匹配键的拼接URL,完全符合你的需求。
内容的提问来源于stack exchange,提问作者szuszfol
相关产品推荐
相关产品推荐

