基本Python练习涉及列表和索引的麻烦

时间:2015-04-22 17:34:43

标签: python arrays list sum

正在进行CheckIO练习,但卡在这里。我需要设计一个函数,找到具有偶数索引(0th,2nd,4th ...)的元素之和,然后将这个求和的数字和数组的最后一个元素相乘。输入是一个数组,输出是一个数字。哦,对于一个空数组,结果必须为零。

def checkio(array):
    sum = 0
    if len(array) == 0: 
        return 0
    else:
        for i in array:    
            if array.index(i) % 2 == 0: 
                sum = sum + i
        final = sum*(array[len(array)-1])
    return final

例如,对于数组[-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41],此函数在应该发出-1476时返回1968

5 个答案:

答案 0 :(得分:3)

据我所知,问题在于您假设数组中的所有数字都是唯一的。例如,假设我有以下数组:

[0,33,33,22,22]

显然在这个数组中你需要第3个和第5个元素(索引2和4)。

使用您当前的代码然而这将永远不会发生,您最终会得到0的总和。这是因为代码:

array.index(i)

找到匹配i的第一个元素,这将是第2个和第4个元素(索引1和3),它们是奇数索引,因此不会被添加。

答案 1 :(得分:2)

您可以使用列表Comprehension。像:

sum([i for i in L[::2]])*L[-1]

在您的代码array.index(i)中存在问题。因此,您可以使用array[::2]

来查找元素

您可以尝试使用代码:

def checkio(array):
    sum = 0
    if len(array) == 0: 
        return 0
    else:
        for i in array[::2]:    
            sum = sum + i
        final = sum*array[-1]
    return final

示例:

L = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41]

Output:    
1968

答案 2 :(得分:1)

这是我制作的一个工作程序。

def checkio(array):
    listSum = 0

    if array:

        for i in range(0, len(array), 2):
            listSum += array[i]

        finalValue = listSum * array[-1]

        return finalValue
    else:
        return 0

首先,它检查数组是否有任何值。我们可以这样做:if array:。如果数组为空,它将返回0,如你所愿。

现在,这是检查数组中每个其他元素的原因:range(0, len(array), 2):这意味着i的值将从0开始,继续数组的长度,并按两次计数。

总和在这里添加:listSum += array[i]。这将获取变量listSum并将数组中索引i处的数字值添加到其中。 +=运算符是listSum = listSum + array[i]的简写。

该函数的最后一部分采用listSum变量,并将其乘以array[-1],它获取数组中的最后一个值,并最终返回它。

当我在上面运行你的示例数组时,它应该返回1968。

答案 3 :(得分:1)

我认为这是为了初学者的解释,即使我重复其他答案已经说过:

至于为什么你的代码不起作用,让我们稍微改变原文:

def checkio(array):
    sum = 0
    if len(array) == 0:
        return 0
    else:
        for i in array:
            print "pos of %s = %i" % (i, array.index(i))
            if array.index(i) % 2 == 0:
                sum = sum + i
            final = sum*(array[len(array)-1])
    return final

这会产生

pos of -37 = 0
pos of -36 = 1
pos of -19 = 2
pos of -99 = 3
[...]
pos of 84 = 9
[...]
pos of 84 = 9

您的问题是因为index()会产生元素第一次出现的索引,而84会出现两次。您的代码仅在数组中的元素是唯一的时才有效,而它们不是。

所以,当没有使用切片进行全面的python招摇时:

def checkio(array):
    # sum is a built-in, don't override it
    result = 0
    # "if len(array) != 0" is the same as "if array"
    if array:
        # enumerate is nice, but not really needed, see below
        for i, x in enumerate(array):    
            # i is the index, x is the value
            if i % 2 == 0: 
                # += is also nice
                result += x
        result *= array[-1]
    return result

对于更加pythonic的解决方案,您可以使用slicing做很多事情。

array[::2]

array

的每一个元素
array[-1] 

是最后一个元素。因此

s = sum(array[::2]) * array[-1]

那不处理空数组,因此

# if there are no elements or only the last element, the sum is zero
if len(array) == 0:
    return 0
else:
    return sum(array[::2]) * array[-1]

甚至

return sum(array[::2]) * array[-1] if array else 0

python相当于三元运算符。

答案 4 :(得分:0)

只需使用枚举来为每个元素与索引进行交互并跟踪最后一个元素。

def checkio(array):
    sum = 0
    last_element = 0

    for index, element in enumerate(array):
        if index % 2 == 0:
           sum += element
        last_element = element

    return last_element * sum