我在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
这也行不通。它说流行指数超出范围
怎么做?
答案 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']