Python удалить каждый третий элемент из списка - PullRequest
1 голос
/ 03 марта 2020
x = [1,2,3,4,5,6,7,8,9,10]
for i in range(len(x)):
    if i%3==0:
        x.pop(i)
print(x)

, поэтому я хочу получить это

[2,3,5,6,8,9]

, вместо этого я получаю ошибку x.pop (i) вне диапазона, я знаю, что есть более простой способ сделать это, но я должен сделать это с для л oop

Ответы [ 5 ]

5 голосов
/ 03 марта 2020

Коротко и просто:

>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> del x[::3]
>>> x
[2, 3, 5, 6, 8, 9]

Проблема с l oop заключается в том, что после вызова pop i-й элемент не такой, как перед вызовом.

>>> x =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> x[3]
4
>>> x.pop(0)
>>> x[3]
5

Вы можете уменьшить это, работая с другим концом списка.

for i in range(len(x)-1, -1, -1):
    if i % 3 == 0:
        x.pop(i)  # or del x[i]
3 голосов
/ 03 марта 2020

Вы получаете это, потому что вы изменяете список x, перебирая его, не рекомендуется. Вам следует создать еще один список с отфильтрованными значениями, например:

x = [1,2,3,4,5,6,7,8,9,10]
output = []
for i, v in enumerate(x):
    if i % 3:
        output.append(v)

print(output)
>>> [2, 3, 5, 6, 8, 9]
0 голосов
/ 03 марта 2020

Вы получаете ошибку, потому что ваш len(x) уменьшается каждый раз, когда вы удаляете элемент, тогда как значение i не меняется по сравнению с новым len(x).

. Вы можете проверить это, добавив print() операторов.

Добавляя эти операторы, ваш код теперь выглядит следующим образом:


x = [1,2,3,4,5,6,7,8,9,10]

for i in range(len(x)):
    if i%3==0:
        print("Before \n i:",i, "len : ",len(x))
        x.pop(i)
        print("After \n i:",i, "len : ",len(x))
print(x)

Это ваша трассировка стека:

Before 
 i: 0 len :  10
After 
 i: 0 len :  9
Before 
 i: 3 len :  9
After 
 i: 3 len :  8
Before 
 i: 6 len :  8
After 
 i: 6 len :  7
Before 
 i: 9 len :  7
Traceback (most recent call last):
  File "q.py", line 6, in <module>
    x.pop(i)
IndexError: pop index out of range

Вы можете внести следующие изменения в код для вывода:

x = [i for i in range(1,11)]
del x[::3]

print(x)
0 голосов
/ 03 марта 2020

Эта ошибка из-за использования len (x) вместо len (x) -1. Но код, который вы записали, не выдает желаемый результат, который вы ищете.

Попробуйте это:

x = [1,2,3,4,5,6,7,8,9,10]
y = []
for i in range(len(x)-1):
    if i%3==0:
        continue;
    else:
        y.append(x[i])
print(y)
0 голосов
/ 03 марта 2020

Как уже отмечали другие, вы удаляете элементы из списка, пока выполняете итерации по нему.

Поскольку вы сказали, что должны использовать for l oop, я бы предложил список понимание:

l = [v for i, v in enumerate(x) if i % 3 != 0]
print(l)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...