Не удаляются элементы которые должны в итерируемом списке

Есть список со списками внутри:

['Designator', 'Footprint', 'Mid X', 'Mid Y', 'Ref X', 'Ref Y', 'Pad X', 'Pad Y', 'Layer', 'Rotation', 'Comment']
['', '', '', '', '', '', '', '', '', '', '']
['R6', 'SMD_0603', '14,4750', '-5,5000', '', '', '', '', 'BottomLayer', '270', '10R']
['R5', 'SMD_0603', '12,3000', '-9,4750', '', '', '', '', 'BottomLayer', '270', '10R']
['R4', 'SMD_0603', '9,8500', '-9,9000', '', '', '', '', 'BottomLayer', '360', '10R']
['DD1', '4017_(R-PDSO-G16__D)', '-7,9043', '13,4634', '', '', '', '', 'BottomLayer', '210', '4017']
['IC1', 'SO-4-2,54_(H-2mm)', '-15,6750', '-0,1250', '', '', '', '', 'T', '90', 'photocoupler']
['IC2', 'SO-4-2,54_(H-2mm)', '-12,8500', '9,5500', '', '', '', '', 'T', '65', 'photocoupler']
['IC3', 'SO-4-2,54_(H-2mm)', '-2,2084', '15,4321', '', '', '', '', 'T', '360', 'photocoupler']
['IC4', 'SO-4-2,54_(H-2mm)', '6,4750', '11,4500', '', '', '', '', 'T', '55', 'photocoupler']
['IC5', 'SO-4-2,54_(H-2mm)', '15,1250', '4,5500', '', '', '', '', 'T', '270', 'photocoupler']
['IC6', 'SO-4-2,54_(H-2mm)', '15,4750', '-3,2250', '', '', '', '', 'T', '270', 'photocoupler']
['IC7', 'SO-4-2,54_(H-2mm)', '8,6494', '-12,6547', '', '', '', '', 'T', '225', 'photocoupler']
['IC8', 'SO-4-2,54_(H-2mm)', '-1,4750', '-15,4250', '', '', '', '', 'T', '180', 'photocoupler']
['IC9', 'SO-4-2,54_(H-2mm)', '-12,0750', '-10,3000', '', '', '', '', 'T', '135', 'photocoupler']
['VD1', 'LED3014', '-14,2821', '-5,2846', '', '', '', '', 'T', '20,3', 'LED,3014SMD_SideEmitting']
['VD2', 'LED3014', '-14,2817', '5,1357', '', '', '', '', 'T', '339,95', 'LED,3014SMD_SideEmitting']
['VD3', 'LED3014', '-7,5535', '13,2013', '', '', '', '', 'T', '299,77', 'LED,3014SMD_SideEmitting']
['VD4', 'LED3014', '2,8496', '15,5605', '', '', '', '', 'T', '79,61', 'LED,3014SMD_SideEmitting']
['VD5', 'LED3014', '11,8182', '9,7846', '', '', '', '', 'T', '219,62', 'LED,3014SMD_SideEmitting']
['VD6', 'LED3014', '15,4050', '-0,0500', '', '', '', '', 'T', '180', 'LED,3014SMD_SideEmitting']
['VD8', 'LED3014', '7,0507', '-18,7721', '', '', '', '', 'T', '100,33', 'LED,3014SMD_SideEmitting']
['VD9', 'LED3014', '-7,5542', '-13,3009', '', '', '', '', 'T', '60,41', 'LED,3014SMD_SideEmitting']
['VT2', 'SOT-23', '7,9874', '-12,6440', '', '', '', '', 'BottomLayer', '360', 'Transistor,PNP']
['VD7', 'LED3014', '11,8190', '-9,8836', '', '', '', '', 'T', '140,1', 'LED,3014SMD_SideEmitting']
['R2', 'SMD_0805', '18,2750', '-1,8250', '', '', '', '', 'BottomLayer', '90', '47K']
['R3', 'SMD_0805', '12,0657', '-1,3726', '', '', '', '', 'BottomLayer', '270', '30R']
['VT1', 'SOT-23', '14,9751', '-1,4249', '', '', '', '', 'BottomLayer', '90', 'Transistor,PNP']
['VT3', 'SOT-23', '11,7749', '-6,2751', '', '', '', '', 'BottomLayer', '270', 'Transistor,PNP']
['VT4', 'SOT-23', '17,2001', '-5,7249', '', '', '', '', 'BottomLayer', '90', 'Transistor,PNP']

Есть код который должен удалять строчки с BottomLayer в них:

    for row in new_lest:
        if row[8] != 'T' and new_lest.index(row) != 0 and new_lest.index(row) != 1:
            new_lest.pop(new_lest.index(row))

И он как бы удаляет строки но почему то некоторые он оставляет, вот что я получаю на выводе:

['Designator', 'Footprint', 'Mid X', 'Mid Y', 'Ref X', 'Ref Y', 'Pad X', 'Pad Y', 'Layer', 'Rotation', 'Comment']
['', '', '', '', '', '', '', '', '', '', '']
['R5', 'SMD_0603', '12,3000', '-9,4750', '', '', '', '', 'BottomLayer', '270', '10R']
['DD1', '4017_(R-PDSO-G16__D)', '-7,9043', '13,4634', '', '', '', '', 'BottomLayer', '210', '4017']
['IC1', 'SO-4-2,54_(H-2mm)', '-15,6750', '-0,1250', '', '', '', '', 'T', '90', 'photocoupler']
['IC2', 'SO-4-2,54_(H-2mm)', '-12,8500', '9,5500', '', '', '', '', 'T', '65', 'photocoupler']
['IC3', 'SO-4-2,54_(H-2mm)', '-2,2084', '15,4321', '', '', '', '', 'T', '360', 'photocoupler']
['IC4', 'SO-4-2,54_(H-2mm)', '6,4750', '11,4500', '', '', '', '', 'T', '55', 'photocoupler']
['IC5', 'SO-4-2,54_(H-2mm)', '15,1250', '4,5500', '', '', '', '', 'T', '270', 'photocoupler']
['IC6', 'SO-4-2,54_(H-2mm)', '15,4750', '-3,2250', '', '', '', '', 'T', '270', 'photocoupler']
['IC7', 'SO-4-2,54_(H-2mm)', '8,6494', '-12,6547', '', '', '', '', 'T', '225', 'photocoupler']
['IC8', 'SO-4-2,54_(H-2mm)', '-1,4750', '-15,4250', '', '', '', '', 'T', '180', 'photocoupler']
['IC9', 'SO-4-2,54_(H-2mm)', '-12,0750', '-10,3000', '', '', '', '', 'T', '135', 'photocoupler']
['VD1', 'LED3014', '-14,2821', '-5,2846', '', '', '', '', 'T', '20,3', 'LED,3014SMD_SideEmitting']
['VD2', 'LED3014', '-14,2817', '5,1357', '', '', '', '', 'T', '339,95', 'LED,3014SMD_SideEmitting']
['VD3', 'LED3014', '-7,5535', '13,2013', '', '', '', '', 'T', '299,77', 'LED,3014SMD_SideEmitting']
['VD4', 'LED3014', '2,8496', '15,5605', '', '', '', '', 'T', '79,61', 'LED,3014SMD_SideEmitting']
['VD5', 'LED3014', '11,8182', '9,7846', '', '', '', '', 'T', '219,62', 'LED,3014SMD_SideEmitting']
['VD6', 'LED3014', '15,4050', '-0,0500', '', '', '', '', 'T', '180', 'LED,3014SMD_SideEmitting']
['VD8', 'LED3014', '7,0507', '-18,7721', '', '', '', '', 'T', '100,33', 'LED,3014SMD_SideEmitting']
['VD9', 'LED3014', '-7,5542', '-13,3009', '', '', '', '', 'T', '60,41', 'LED,3014SMD_SideEmitting']
['VD7', 'LED3014', '11,8190', '-9,8836', '', '', '', '', 'T', '140,1', 'LED,3014SMD_SideEmitting']
['R3', 'SMD_0805', '12,0657', '-1,3726', '', '', '', '', 'BottomLayer', '270', '30R']
['VT3', 'SOT-23', '11,7749', '-6,2751', '', '', '', '', 'BottomLayer', '270', 'Transistor,PNP']

Ответы (1 шт):

Автор решения: CrazyElf

Потому что сто раз уже тут писали в разных ответах - не надо удалять элементы из списка, по которому итерируетесь, обязательно сюрприз какой-нибудь будет, потому что вы нарушаете нумерацию элементов списка и некоторые элементы могут быть пропущены в результате. Лучше фильтруйте данные и создавайте новый список, например так:

new_lest = [row for i,row in enumerate(new_lest) if row[8] == 'T' or i <= 1]

Ну хорошо, можно на самом деле и ваш код починить, если итерироваться по копии списка, чтобы не нарушать процесс итерации:

for row in new_lest.copy(): # ИТЕРИРУЕМСЯ ПО КОПИИ!
    if row[8] != 'T' and new_lest.index(row) != 0 and new_lest.index(row) != 1:
        new_lest.pop(new_lest.index(row))

Если хотите понять, что происходит, то просто добавьте print(row) в цикл и вы увидите, что при итерировании пропускается строка, следующая за удаляемой:

for row in new_lest:
    print(row)
    if row[8] != 'T' and new_lest.index(row) != 0 and new_lest.index(row) != 1:
        new_lest.pop(new_lest.index(row))
        print('удалили')
→ Ссылка