正在进行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
。
答案 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