首页 > 解决方案 > 我有几个列表,每个列表包含 206 个元素。当我尝试引用那些 206 中的索引时,我得到了一个错误

问题描述

我有几个对应的列表,每个列表正好包含 206 个元素。元素的数量和这些元素的值可能会有所不同,具体取决于程序读取的文件中的内容。

这些列表之一完全由整数组成,并用作确定是否应从所有列表中删除元素的基础。我的代码如下:

toRemove = []
for element in myList:
    if element < int(cutoff):  # cutoff is specified by the user
        toRemove.append(myList.index(element))
toRemove = [int(element) for element in toRemove]
for element in toRemove:
    del myList2[element]
    del myList3[element]
    ...

当我运行时>>>len(myList),Python 为所有列表返回 206,减去 toRemove 因为 toRemove 是根据用户输入确定的。但是,当我使用 toRemove 从所有列表中删除这些索引时,Python 会向我打招呼:

Traceback (most recent call last):
  File "Test.py", line 104, in <module>
    del myList2[element]
IndexError: list assignment index out of range

toRemove 中的最大值是 204——这个列表中有 205 个索引。toRemove 不包含任何小于 0 的值。将 [element] 类型转换为 [int(element)] 会引发相同的错误。

要删除的索引列表:

[0, 1, 2, 3, 4, 5, 6, 7, 9, 12, 15, 16, 17, 18, 20, 21, 22, 25, 26, 28, 29, 30, 31, 33, 34, 37, 38, 39, 40, 41, 45, 46, 47, 48, 51, 52, 54, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 72, 73, 74, 75, 77, 80, 84, 86, 87, 88, 89, 90, 91, 92, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 126, 127, 128, 129, 130, 133, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 147, 149, 151, 110, 153, 154, 155, 157, 158, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 173, 174, 175, 177, 178, 179, 180, 181, 182, 183, 184, 186, 187, 188, 189, 190, 192, 194, 195, 196, 197, 198, 200, 202, 203, 204]

如您所见,不小于 0 或大于 205。

要检查的号码列表:

[1032, 3882, 4182, 6880, 1170, 1968, 2085, 3548, 9111, 1122, 11987, 12718, 7606, 8391, 8890, 2574, 1447, 6257, 1457, 11430, 7202, 6891, 1495, 12372, 12907, 2243, 3984, 11236, 3462, 4790, 1103, 1044, 8805, 1404, 6259, 8655, 13695, 6505, 3758, 2378, 3303, 3360, 9102, 14768, 12154, 3079, 3307, 2416, 7043, 9910, 10050, 6497, 2407, 13477, 4118, 13762, 1351, 3645, 4092, 3785, 1565, 3721, 4982, 4166, 11234, 7306, 3608, 2437, 4022, 2688, 11411, 9126, 3526, 1398, 5657, 2336, 8775, 4073, 14731, 8885, 7264, 8399, 10268, 12131, 2129, 11420, 1334, 3675, 1055, 3544, 5301, 6608, 1482, 14221, 2254, 4288, 1178, 5032, 4973, 19573, 3855, 4360, 6408, 3040, 3220, 11735, 3591, 3807, 2590, 6169, 2300, 1332, 8996, 6680, 3537, 1048, 3505, 5960, 3480, 1486, 4782, 4607, 18269, 8258, 4514, 8069, 5698, 1753, 6314, 1634, 3688, 9249, 18783, 5514, 1409, 7197, 3789, 8172, 2718, 5535, 3508, 1769, 2503, 8178, 2414, 1175, 13069, 1916, 12297, 1732, 69609, 3047, 2300, 5752, 1106, 1522, 11687, 3020, 3929, 9407, 13449, 4644, 2399, 4317, 4917, 5476, 1194, 4016, 1496, 7788, 9365, 1223, 12289, 1624, 1410, 3321, 12930, 1806, 7154, 4961, 2798, 5571, 1931, 7912, 4944, 10963, 2427, 7514, 2425, 2649, 1303, 13568, 2923, 11225, 5822, 4268, 5962, 2422, 6978, 12393, 1331, 12749, 7460, 1683, 6403, 11972]

您可以cutoff用 8000 代替,因为这是我用来测试程序的数字。

我做错了什么,我该如何纠正这个问题?

标签: pythonpython-3.x

解决方案


正如评论所说,当您删除某些内容时,列表的大小会减小并且进一步的元素会移动(没有间隙)。

你可以做的是:

1. 使用你已经使用过的,但是从最高的索引开始。

2. 使用您的循环标记要删除的元素(例如,通过分配一个 None 或列表中未使用的其他值)而不是物理删除它 - 并在循环之后将它们过滤掉(例如使用myList2 = [elem for elem in myList2 if elem])。

3. 使用列表推导并完全避免使用循环。

myList2 = [value for (index, value) in enumerate(myList2) if index not in toRemove]

推荐阅读