试图返回列表中的数字

时间:2013-10-08 21:53:08

标签: python

我在这里有一些关于此代码的问题。我要做的是编写一个函数,它接受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

4 个答案:

答案 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.
    """
    …

这里有四个重点:

  1. 名称非常重要,odd_onlyoption更具描述性,并且在不分割任何内容时调用方法splitList会让您感到困惑。
  2. 当语言具有内部布尔值时,不要使用任意整数来表示布尔选项。
  3. 该方法没有名称可能允许读者理解其高度特殊的功能(extract_odd_or_magnitude_of_five难以输入,而仍然不具有描述性。这就是docstrings的原因,它们将方法的描述与方法定义紧密结合。
  4. 公约很重要。 Style Guide for Python可帮助其他人阅读您的代码。