如何将两个列表转换为一一对应的Python字典
问题:将两个列表按索引匹配转换为字典
问题背景
有两个列表list_id和productos,需要转换为字典,要求每个ID对应列表中相同索引位置的产品。但原代码生成的字典里所有ID都对应同一个产品,不符合需求。
原代码及问题
输入列表
list_id= ['2000391314791P', '2000391314715P', '2000383032443P', '2000387592776P', '2000391314760P', '2000387592813P', '2000383032511P', '2000391314784P', '2000387592738P', '2000387592806P', '2000387592769P', '2000387592790P', '2000387592752P', '2000391314746P', '2000391314777P', '2000391314753P', '2000391314814P', '2000387592783P', '2000383032429P', '2000383032467P', 'MPM00043444018', 'MPM00040888375']
productos= ['APPLE MACBOOK PRO 13,3" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 256GB SSD / COLOR PLATA', 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 8NUC) / 8GB RAM / 256GB SSD / COLOR PLATA', 'APPLE MACBOOK AIR 13,3" / CHIP M1 (CPU 8NUC Y GPU 7NUC) / 8GB RAM / 256GB SSD / COLOR PLATA', 'APPLE MACBOOK PRO 16" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 1TB SSD / COLOR PLATA', 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 512GB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 14" / CHIP M1 PRO (CPU 8NUC Y GPU 14NUC) / 16GB RAM / 512GB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 13,3" / CHIP M1 (CPU 8NUC Y GPU 8NUC) / 8GB RAM / 512GB SSD / COLOR PLATA', 'APPLE MACBOOK PRO 13,3" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 256GB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 16" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 512GB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 14" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 1TB SSD / COLOR PLATA', 'APPLE MACBOOK PRO 16" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 1TB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 14" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 1TB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 16" / CHIP M1 MAX (CPU 10NUC Y GPU 32NUC) / 32GB RAM / 1TB SSD / COLOR PLATA', 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 512GB SSD / AZUL MEDIANOCHE', 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 512GB SSD / BLANCO ESTELAR', 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 512GB SSD / COLOR PLATA', 'APPLE MACBOOK PRO 13,3" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 512GB SSD / COLOR PLATA', 'APPLE MACBOOK PRO 16" / CHIP M1 PRO (CPU 10NUC Y GPU 16NUC) / 16GB RAM / 512GB SSD / COLOR PLATA', 'APPLE MACBOOK AIR 13,3" / CHIP M1 (CPU 8NUC Y GPU 7NUC) / 8GB RAM / 256GB SSD / COLOR ORO', 'APPLE MACBOOK AIR 13,3" / CHIP M1 (CPU 8NUC Y GPU 8NUC) / 8GB RAM / 512GB SSD / GRIS ESPACIAL', 'APPLE MACBOOK PRO 14.2 1TB M1 PRO 10C GPU 16C SILVER', 'APPLE MACBOOK PRO 14.2 1TB M1 PRO 10C GPU 16C SPACE GREY']
原错误代码
datos = { id_: { 'name': i for i in productos} for id_ in lista_id}
问题原因
原代码中,每个ID对应的{'name': i for i in productos}是一个字典推导式,它会遍历整个productos列表,最终name的值会被覆盖为列表的最后一个元素,导致所有ID都对应同一个产品。
正确解法
要实现索引匹配,需要将两个列表按位置配对,Python的zip()函数可以把两个列表中对应索引的元素打包成元组,再转换为字典。
代码实现
datos = {id_: {'nombre': producto} for id_, producto in zip(list_id, productos)}
结果示例
生成的字典会是每个ID对应相同索引的产品,比如:
{ '2000391314791P': {'nombre': 'APPLE MACBOOK PRO 13,3" / CHIP M2 (CPU 8NUC Y GPU 10NUC) / 8GB RAM / 256GB SSD / COLOR PLATA'}, '2000391314715P': {'nombre': 'APPLE MACBOOK AIR 13,6" / CHIP M2 (CPU 8NUC Y GPU 8NUC) / 8GB RAM / 256GB SSD / COLOR PLATA'}, ... 'MPM00040888375': {'nombre': 'APPLE MACBOOK PRO 14.2 1TB M1 PRO 10C GPU 16C SPACE GREY'} }
注意事项
- 确保
list_id和productos的长度一致,否则zip()会以较短的列表长度为准,超出的元素会被忽略。如果需要处理长度不一致的情况,可以使用itertools.zip_longest()来填充缺失值。
内容的提问来源于stack exchange,提问作者MATIAS IGNACIO OLIVA ALCAYAGA
相关产品推荐
相关产品推荐

