【问题标题】:Trouble with Basic Python exercise involving lists and indexes涉及列表和索引的基本 Python 练习的问题
【发布时间】:2015-04-22 17:34:43
【问题描述】:

从事 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

【问题讨论】:

  • if len(array) == 0:可以简写为if array:,如果在if中返回就不用else了
  • @TimCastelijns 我不认为在没有深入解释的情况下对遇到此类问题的人说这句话是个好主意。尤其是if not array ;)
  • @ThinkChaos 我认为这不需要深入解释,它是基本的python
  • index 只是在数组中找到元素并返回元素的第一次出现,因此对于具有 repeated 元素的数组,您的函数将无法工作,(84 是在您的阵列上重复)
  • 总和中是否包含last元素?

标签: python arrays list sum


【解决方案1】:

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

[0,33,33,22,22]

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

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

array.index(i)

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

【讨论】:

  • 注意:在OP的数组中,84出现了两次,其余都是唯一的
  • 等等,我们需要第一个和第三个元素,因为我们想要具有偶数索引的元素 ([0], [2]) ...如果示例数组是类似 [10, 11, 11, 12]?然后 11 不会被添加到总和中,因为第一个索引调用将始终返回 [1],而不是 [2],并且 1 不是偶数。
  • @SpicyClubSauce 已修复,很抱歉造成混淆
【解决方案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

【讨论】:

  • sum([i for i in L[:-1:2]])*L[-1],如果最后一个元素不支持作为总和的一部分。
  • 这很好,但 OP 也对为什么他自己的代码不起作用很感兴趣
  • 列表理解中 :: 是什么意思?
  • @Spicy - 我在答案中给出了一个链接#comprehension
  • @SpicyClubSauce 不是列表理解,而是切片。切片基本上是[start:end:step]。所有这些都可以省略。
【解决方案3】:

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

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。

【讨论】:

  • 谢谢,如果你觉得它最有帮助和简洁,请接受它。
【解决方案4】:

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

至于为什么你的代码不起作用,我们把原来的稍微改一下:

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 swagger 时:

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 相当于三元运算符。

【讨论】:

    【解决方案5】:

    只需使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多