Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
涉及列表和索引的基本Python练习有问题_Python_Arrays_List_Sum - Fatal编程技术网

涉及列表和索引的基本Python练习有问题

涉及列表和索引的基本Python练习有问题,python,arrays,list,sum,Python,Arrays,List,Sum,正在做CheckIO练习,但被困在这里。我需要设计一个函数,找到索引为0,2,4的元素的和。。。然后将这个求和的数字和数组的最后一个元素相乘。输入是一个数组,输出是一个数字。对于空数组,结果必须为零 def checkio(array): sum = 0 if len(array) == 0: return 0 else: for i in array: if array.index(i) % 2 == 0

正在做CheckIO练习,但被困在这里。我需要设计一个函数,找到索引为0,2,4的元素的和。。。然后将这个求和的数字和数组的最后一个元素相乘。输入是一个数组,输出是一个数字。对于空数组,结果必须为零

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],这个函数在应该给出1968的时候返回-1476。

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

[0,33,33,22,22]
显然,在这个数组中,需要第3个和第5个元素索引2和4

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

array.index(i)

查找与i匹配的第一个元素,这将是索引1和3的第二个和第四个元素,它们是奇数索引,因此不会被添加。

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

[0,33,33,22,22]
显然,在这个数组中,需要第3个和第5个元素索引2和4

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

array.index(i)
查找与i匹配的第一个元素,这将是索引1和3的第二个和第四个元素,它们是奇数索引,因此不会被添加。

您可以使用列表。比如:

在您的代码数组中,indexi是一个问题。因此,您可以使用数组[::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
您可以使用列表。比如:

在您的代码数组中,indexi是一个问题。因此,您可以使用数组[::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

只需使用enumerate将每个元素与索引交互,并跟踪最后一个元素

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

只需使用enumerate将每个元素与索引交互,并跟踪最后一个元素

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

这是我做的一个工作程序

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
首先,它检查数组是否有任何值。我们可以这样做:如果数组:。如果数组为空,它将返回您想要的0

现在,这是检查数组中每个其他元素的内容:range0,lenarray,2:这意味着i的值将从0开始,继续数组的长度,并按2计数

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

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


当我运行上面的示例数组时,它返回了1968,这是我编写的一个工作程序

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
首先,它检查数组是否有任何值。我们可以这样做:如果数组:。如果数组为空,它将返回您想要的0

现在,这是检查数组中每个其他元素的内容:range0,lenarray,2:这意味着i的值将从0开始,继续数组的长度,并按2计数

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

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


当我运行上面的示例数组时,它返回了1968,正如它应该返回的那样。

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

至于为什么您的代码不起作用,让我们稍微修改一下原始代码:

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
这是您的问题,因为索引生成元素第一次出现的索引,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
至于一个更具Python风格的解决方案,你可以用它做很多事情

是数组的第二个元素,并且

是最后一个元素。因此

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的三元运算符的等价物。

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

至于为什么您的代码不起作用,让我们稍微修改一下原始代码:

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
这是您的问题,因为索引生成元素第一次出现的索引,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
至于一个更具Python风格的解决方案,你可以用它做很多事情

是数组的第二个元素,并且

是最后一个元素。因此

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中三元运算符的等价形式。

if lenarray==0:可以缩短为if array:,如果返回if@TimCastelijns我认为在没有深入解释的情况下,对一个正在与这种问题作斗争的人说这样的话不是一个好主意。特别是当它不是数组时@ThinkChaos我认为这不需要深入的解释,它是基本的pythonindex,只需在数组中找到元素并返回元素的第一次出现,因此对于包含重复元素的数组,函数将无法工作,84在数组中重复。是和中包含的最后一个元素吗?if lenarray==0:可以缩短为if array:,如果在if@TimCastelijns我认为在没有深入解释的情况下,对一个正在与这种问题作斗争的人说这样的话不是一个好主意。特别是当它不是数组时@ThinkChaos我不认为这需要一个深入的解释,它是基本的pythonindex,只在数组中找到元素并返回元素的第一次出现,因此对于一个包含重复元素的数组,函数将不起作用,在数组中重复84是包含在sum中的最后一个元素吗?或者sum[I代表L[:-1:2]*L[-1]如果最后一个元素不被支持成为总和的一部分。那很好,但是OP也对他自己的代码为什么不工作感兴趣::在列表理解中意味着什么?@spice-我在回答中给出了一个链接comprehension@SpicyClubSauce这不是一个列表理解,而是一个片段。切片基本上是[开始:结束:步骤]。所有这些都可以省略。或者sum[i for i in L[:-1:2]]*L[-1],如果不支持最后一个元素作为sum的一部分。这很好,但OP也对自己的代码为什么不工作感兴趣::在列表理解中意味着什么?@spice-我在回答中给出了一个链接comprehension@SpicyClubSauce这不是一个列表理解,而是一个片段。切片基本上是[开始:结束:步骤]。所有这些都可以省略。注意:在OP的数组中,84出现两次,其余的是唯一的等待,我们需要第一个和第三个元素,因为我们需要索引为偶数[0]、[2]。。。如果示例数组类似于[10,11,11,12],那么这种解释是否更有意义?那么11将不会被添加到总和中,因为第一个索引调用将始终返回[1],而不是[2],并且1不是偶数。@Spicyclubause已修复,很抱歉出现混淆注意:在OP的数组中,84出现两次,其余的是唯一的等待,我们需要第一个和第三个元素,因为我们希望元素具有偶数索引[0],[2]。。。如果示例数组类似于[10,11,11,12],那么这种解释是否更有意义?那么11将不会被添加到总和中,因为第一个索引调用将始终返回[1],而不是[2],并且1不是偶数。@SpicyClubSauce Fixed,抱歉混淆谢谢,如果您觉得它最有用、最简洁,请接受它。谢谢,如果您觉得它最有用、最简洁,请接受它。