Python列表转字典时出现索引越界错误的求助
列表转字典时出现IndexError的原因分析
原始数据列表
['BILL FROM:', 'TestCorp', 'USA, NY 02123, Washington St.', 'New York, NY, 02123', 'United States', 'musicjohnliofficial@gmail.com', 'BILL TO:', 'Yao Min', 'LA, 2123, Los Angeles', 'new York, NY, 9803432', 'United States', 'yao123@mail.com', 'INVOICE #', '01', 'INVOICE DATE', '2022-08-05', 'AMOUNT DUE', '$36.79', 'SUBTOTAL', '$36.74', 'TAX (0.13%)', '$0.05', 'TOTAL', '$36.79', 'Item', 'Description', 'Quantity', 'Unit Cost', 'Line Total', 'Pen', 'Pen, black coloe', '1.5', '$1.16', '$1.74', 'Book', 'Calculus, Zorych, pt. 1', '3.5', '$10.00', '$35.00', 'Powered by Shopify', 'www.shopify.com']
需求说明
需要将上述列表转换为字典,规则是列表中第i个元素作为键,第i+1个元素作为对应值,目标格式示例:
{'Bill From:': 'TestCorp',..., 'Powered by Shopify': 'www.shopify.com'}
出错的代码及错误信息
尝试用字典推导式构建字典,但代码参数有误:
res_dct = {prepared_data[i]: prepared_data[i + 1] for i in range(, len(prepared_data))}
运行后抛出错误:
IndexError: list index out of range
测试成功的小例子
用短列表测试时代码正常运行:
>>> lst = ['a', 1, 'b', 2, 'c', 3] >>> res_dct = {lst[i]: lst[i + 1] for i in range(0, len(lst), 2)} >>> res_dct {'a': 1, 'b': 2, 'c': 3}
问题原因及解决方案
问题根源
- 出错代码中
range(, len(prepared_data))缺少起始参数0,更关键的是未指定步长2。 - 当遍历到列表最后一个元素(索引为
len(prepared_data)-1)时,i+1会超出列表最大索引范围,触发IndexError。 - 短列表测试代码正确,是因为用了
range(0, len(lst), 2),步长设为2后,i只会取0、2、4这类偶数索引,确保i+1不会越界。
修正后的代码
将推导式中的range参数调整为带步长的形式:
res_dct = {prepared_data[i]: prepared_data[i + 1] for i in range(0, len(prepared_data), 2)}
注:原始列表中存在同一类别下的多段值(比如BILL FROM:对应的后续地址信息),按此方式转换会将USA, NY 02123, Washington St.作为TestCorp的键,这可能不符合实际需求。如果需要将BILL FROM:对应所有后续地址信息,还需要额外逻辑处理键值的分组,但当前报错的核心问题是步长缺失导致的索引越界。
内容的提问来源于stack exchange,提问作者user19801425
相关产品推荐
相关产品推荐

