我在这里有一些关于此代码的问题。我要做的是编写一个函数,它接受2个输入,一个列表和一个选项,该选项为0或1,并返回列表中的数字列表。如果该选项为0,则返回大于5或小于-5的数字。如果选项为1,它将返回第一个列表中所有奇数的列表。这就是我现在的代码所在:
def splitList(myList, option):
nList = []
for element in range(0,len(myList)):
if option == 0:
if myList[element] > 5:
nList.append(element)
return nList
现在我让它返回一个列表,列出元素是否大于5,但它返回列表中的位置,而不是实际值。说我跑了程序
splitList([-6,4,7,8,3], 0)
它会回来 [2,3]
我想要它也返回7和8以及-6的值但我知道我现在没有正确的代码返回-6。有人能引导我朝着正确的方向前进。另外,我想在这里使用for循环。如果选项为1,我也不知道如何返回奇数。
这是我的代码:
def splitList(myList, option):
nList = []
for element in myList:
if option == 0:
if abs(element) > 5:
nList.append(element)
elif option == 1:
if element % 2:
nList.append(element)
return nList
我怎样才能将其切换到while循环? 我尝试了以下代码,但它似乎不起作用:
def splitList2(myList, option):
nList = []
element = 0
while element < len(myList):
if option == 0:
if abs(element) > 5:
nList.append(element)
elif option == 1:
if element % 2:
nList.append(element)
element = element + 1
return nList
答案 0 :(得分:3)
尽管命名变量element
,但它实际上是索引,而不是该索引的元素。
你可以说,因为你必须使用myList[element]
进行比较。
所以,要修复它,再做同样的事情:
nList.append(myList[element])
但是,有一种更简单的方法:直接循环遍历元素。
nList = []
for element in nList:
if option == 0:
if element > 5:
nList.append(element)
return nList
你几乎从不想要遍历range(len(spam))
。通常,您只需要元素,因此只需循环spam
。有时您需要索引和元素,因此循环遍历enumerate(spam)
。如果你真的只需要索引......退一步确保你真的这样做(通常人们认为他们只是因为他们不了解zip
,或者因为他们试图在原地进行更改复制,但以不起作用的方式进行复制。)
或者,更简单:
if option != 0:
return []
return [element for element in nList if element > 5]
同时
我希望它也返回7和8以及-6的值但我知道我现在没有正确的代码返回-6。
您可以将您的英语直接翻译成Python:
它将返回大于5或小于-5的数字
......是:
… 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)
丑陋,不是吗?但通常情况下,你可以提出一些更简单的东西,特别针对你的情况。例如,如果iterable是一个序列,列出一个list
,你可以这样做:
index, size = 0, len(sequence)
while index < size:
spam(sequence[index])
index += 1
仍然不如for
循环好,但不像通用while
那样难看。
最后,只是为了好玩。每个人都知道函数映射比elif
链更像Pythonic,对吧?为了证明教条遵循这样的规则的价值,让我们在这里做:
preds = {0: lambda x: abs(x) > 5,
1: lambda x: x % 2}
def splitList(myList, option):
return filter(preds[option], myList)
答案 1 :(得分:1)
看起来你应该只编写两个单独的函数,因为你试图添加选项的函数做了相当不同的事情。
Python允许您轻松地遍历列表和其他数据结构:
for element in myList:
if option == 0:
if element > 5:
nList.append(element)
....
答案 2 :(得分:0)
因为单行很有趣:
def splitlist(li, flag):
return [x for x in li if x%2==1] if flag else [x for x in li if abs(x)>5]
如果这是作业,你可能不想转而回答这个问题,但它应该给出一些想法。
答案 3 :(得分:0)
问题的其他方面已经得到了很好的回答,但是你的论证使用中存在一种相当不合理的结构。更好的是:
def extract_elements(my_list, odd_only):
"""Return select elements from my_list.
If odd_only is True return the odd elements.
If odd_only is False return elements between -5 and 5 inclusive.
"""
…
这里有四个重点:
odd_only
比option
更具描述性,并且在不分割任何内容时调用方法splitList
会让您感到困惑。extract_odd_or_magnitude_of_five
难以输入,而仍然不具有描述性。这就是docstrings的原因,它们将方法的描述与方法定义紧密结合。