如何删除列表中的所有奇数序项?

时间:2014-02-17 13:46:33

标签: python list

我在stackoverflow上搜索过,看到有人写这个:

[item for item in yourlist if item % 2]

它对我不起作用。

我的代码是这样的:

x = ['apple','fruit','orange','fruit','lemon','fruit']
for i in range(0,len(x),2):
    if i%2 !=0:
        x.pop(i)
print x

这也行不通。它说流行指数超出范围

怎么做?

2 个答案:

答案 0 :(得分:8)

使用步幅切片:

x = x[1::2]

或选择奇数项目而不是偶数项目:

x = x[::2]

第一个元素从第二个项目开始,在输入列表中每隔一个元素。另一个从列表中获取每个第二个元素,从第一个项开始。

演示:

>>> x = ['apple', 'fruit', 'orange', 'fruit', 'lemon', 'fruit']
>>> x[1::2]
['fruit', 'fruit', 'fruit']
>>> x[::2]
['apple', 'orange', 'lemon']

原始代码仅在想要选择偶数时才有效,而不是偶数索引。您可以使用enumerate() function向该循环添加索引:

>>> [f for i, f in enumerate(x) if i % 2]
['fruit', 'fruit', 'fruit']

但切片在这里更容易。

答案 1 :(得分:3)

您的代码失败,因为您正在尝试修改正在迭代的列表,而不考虑副作用。

x = ['apple','fruit','orange','fruit','lemon','fruit']
for i in range(0,len(x),2):
    if i%2 !=0:
        x.pop(i)
print x

注意1: range(0,len(x),2)将生成[0, 2, 4],但这些条件都不会成功。所以,我假设你的意思是range(1,len(x),2)

注2:由于您正在迭代range(1,len(x),2),实际上是[1, 3, 5]if条件已过时。

i为1时,我们将元素弹出1.所以实际发生的是

在1

中弹出元素之前
x = ['apple','fruit','orange','fruit','lemon','fruit']
        0       1        2       3       4       5

在1

后弹出元素
x = ['apple','orange','fruit','lemon','fruit']
        0       1        2       3       4

同样,当i变为3时,我们将元素弹出3

在3

中弹出元素之前
x = ['apple','orange','fruit','lemon','fruit']
        0       1        2       3       4

在3

后弹出元素
x = ['apple','orange','fruit','fruit']
        0       1        2       3

现在,i变为5,位置5处没有元素。这就是x.pop(5)提升

的原因
pop index out of range

错误。您可以使用此程序确认

x = ['apple','fruit','orange','fruit','lemon','fruit']
try:
    for i in range(1,len(x),2):
        if i%2 !=0:
            x.pop(i)
except IndexError, e:
    print e, x, i

输出就像这样

pop index out of range ['apple', 'orange', 'fruit', 'fruit'] 5

<强>解决方案

您可以使用切片表示法来获取偶数序数数据中的元素,例如

print x[::2]    # ['apple', 'orange', 'lemon']

你可以像这样的

获得奇数序数的元素
print x[1::2]   # ['fruit', 'fruit', 'fruit']

否则,您可以使用列表推导来过滤掉奇数序数据,例如

x = ['apple','fruit','orange','fruit','lemon','fruit']
print [item for idx, item in enumerate(x) if idx % 2 == 0]
# ['apple', 'orange', 'lemon']
print [item for idx, item in enumerate(x) if idx % 2 == 1]
# ['fruit', 'fruit', 'fruit']