尽管命名你的变量element
,它实际上是索引,而不是该索引处的元素。
你可以这么说,因为你必须使用myList[element]
来比较它。
因此,要修复它,请再次执行相同的操作:
nList.append(myList[element])
然而,有一种更简单的方法可以做到这一点:直接循环遍历元素。
nList = []
for element in nList:
if option == 0:
if element > 5:
nList.append(element)
return nList
你几乎never想要循环播放range(len(spam))
。通常,您只需要元素,因此只需循环即可spam
本身。有时你需要索引and元素,所以循环enumerate(spam)
。如果您真的只需要索引......退一步并确保您确实需要(通常人们认为他们想要这个只是因为他们不知道zip
,或者因为他们试图就地进行更改而不是复制,但这样做的方式行不通)。
或者,更简单地说:
if option != 0:
return []
return [element for element in nList if element > 5]
同时:
我也希望它返回 7 和 8 以及 -6 的值,但我知道我现在没有正确的代码来返回 -6 。
你可以将英语直接翻译成Python:
它将返回大于 5 或小于 -5 的数字
… is:
… element > 5 or element < -5 …
然而,如果你理解的话,有一种更简单的写法:
… abs(element) > 5 …
所以,这使得选项 0 起作用。那么选项 1 呢?
判断一个数是否为奇数的一种简单方法是number % 2
是非零的。
那么,让我们把它们放在一起:
if option == 0:
return [element for element in nList if abs(element) > 5]
elif option == 1:
return [element for element in nList if element % 2]
else:
raise ValueError("I don't know option {}".format(option))
来自评论:
我如何将其更改为 while 循环?
要改变一个for
循环进入while
循环,你必须把它分成三个部分:初始化循环变量,写一个while
测试,并更新体内的循环变量。一般的翻译是这样的:
for element in iterable:
spam(element)
it = iterator(iterable)
while True:
try:
element = next(it)
except StopIteration:
break
else:
spam(element)
丑陋,不是吗?但通常情况下,您可以针对您的情况想出一些更简单的方法。例如,如果可迭代对象是一个序列,则列出一个list
, 你可以这样做:
index, size = 0, len(sequence)
while index < size:
spam(sequence[index])
index += 1
仍然不如for
循环,但不像通用的那么难看while
.
最后,只是为了好玩。每个人都知道函数映射比elif
链子,对吧?为了证明教条地遵循这样的规则的价值,让我们在这里这样做:
preds = {0: lambda x: abs(x) > 5,
1: lambda x: x % 2}
def splitList(myList, option):
return filter(preds[option], myList)