如何用zip_longest按索引配对嵌套列表,避免交叉组合?
解决不等长嵌套列表的同索引配对问题
问题根源
你的代码使用了双层循环(或列表推导式中的双重遍历),导致claim_num的所有子列表和claim_text的所有子列表进行交叉组合,而非按外层列表的索引一一配对。
解决方案
先通过zip(或zip_longest,处理外层列表长度不等的情况)将claim_num和claim_text的同索引子列表配对,再对每一对子列表使用zip_longest处理内部元素。
代码示例(外层列表长度相等时)
from itertools import zip_longest claim_text = [['1. A method', '2. The method', '3. Description'], ['1. A method', '2. The method', '3. The method', '5. The method']] claim_num = [['1', '2'], ['1', '2', '3']] # 循环写法 combined = [] for num_list, text_list in zip(claim_num, claim_text): paired_items = list(zip_longest(num_list, text_list, fillvalue='Description')) combined.append(paired_items) # 列表推导式写法 combined = [list(zip_longest(num_list, text_list, fillvalue='Description')) for num_list, text_list in zip(claim_num, claim_text)] print(combined)
输出结果
[ [('1', '1. A method'), ('2', '2. The method'), ('Description', '3. Description')], [('1', '1. A method'), ('2', '2. The method'), ('3', '3. The method'), ('Description', '5. The method')] ]
处理外层列表长度不等的情况
如果claim_num和claim_text的外层列表长度不一致,用zip_longest处理外层,指定fillvalue为空白列表:
from itertools import zip_longest claim_text = [['1. A method', '2. The method'], ['1. A method', '2. The method', '3. Description']] claim_num = [['1', '2'], ['1', '2', '3'], ['4', '5']] # 外层多一个元素 combined = [] for num_list, text_list in zip_longest(claim_num, claim_text, fillvalue=[]): paired_items = list(zip_longest(num_list, text_list, fillvalue='Description')) combined.append(paired_items) print(combined)
关键说明
zip(claim_num, claim_text):将两个外层列表的同索引子列表一一配对,仅处理到较短列表的长度。zip_longest(num_list, text_list, fillvalue='Description'):对子列表内部元素配对,长度不足的用fillvalue补充。
内容的提问来源于stack exchange,提问作者wiseass
相关产品推荐
相关产品推荐

