如何通过for循环从嵌套JSON中提取键值对并存储为字典
问题
我有一个由多层字典和列表嵌套组成的JSON数据,目前通过for循环可以分别将code提取到code_details列表、url提取到url_details列表,但希望调整循环逻辑,把结果存储为{'code': 'url'}格式的字典。
原代码:
code_details = [] url_details = [] for item in all_content: code_details.append(item ['code']) media_details = item ['media'] for i in media_details: resources_details = i['resources'] for j in resources_details: url_details.append(j ['url'])
JSON示例数据:
all_content = [ { "code": "0100410ZWA", "media": [ { "containsExplicitContent": true, "imageType": "Packshot", "resources": [ { "expirationDate": "2021-05-20T11:07:00Z", "format": "ORIGINAL", "url": "https://media.lingeriestyling.com/marie_jo_l'aventure-lingerie-padded_bra-tom-0120826-pink-0_L_35590.jpg" } ] } ] } ]
code_details示例:
['0502570SRE', '0102649ALF', '0602640ALF', '0502572SRE', '0102646ALF', '0102570SRE', '0502571SRE', '0602570SRE', '0502640ALF', '0102640ALF', '0102574SRE', '0502642ALF', '0102576SRE', '0502641ALF', '0663321AME', '0163244AUT', '0563240AUT', '0663320AME']
url_details示例:
['https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-0_3558237.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-0_3560011.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-2_3560012.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-3_3560013.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-0_3558965.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-2_3558970.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-briefs-danae-0502570-red-3_3558976.jpg', 'https://media.lingeriestyling.com/eservices/marie_jo-lingerie-balcony_bra-raia-0102649-multicolour-0_3558308.jpg']
解决方案
从示例数据能看出一个code可能对应多个url,而字典的键具有唯一性,因此提供两种适配场景的实现方式:
方式1:一个code对应单个url(取首个匹配的url)
如果每个code仅需要关联一个url,可按以下逻辑实现,避免后续url覆盖已有值:
code_url_dict = {} for item in all_content: current_code = item['code'] if current_code not in code_url_dict: for media in item['media']: for resource in media['resources']: code_url_dict[current_code] = resource['url'] # 取第一个url后跳出循环 break else: continue break
方式2:一个code对应多个url(值为url列表)
如果需要保留code对应的所有url,将字典值设为列表更合理:
code_url_dict = {} for item in all_content: current_code = item['code'] # 初始化空列表(若code未在字典中) if current_code not in code_url_dict: code_url_dict[current_code] = [] # 遍历所有层级,收集当前code对应的所有url for media in item['media']: for resource in media['resources']: code_url_dict[current_code].append(resource['url'])
场景说明
- 方式1适合每个code仅对应一个有效url的业务场景;
- 方式2更贴合你的示例数据结构,能完整保留code与所有关联url的映射关系。
内容的提问来源于stack exchange,提问作者Ron Kieftenbeld
相关产品推荐
相关产品推荐

