如何使用range(len(list))查找列表中所有偶数索引整数的乘积?

时间:2018-12-18 13:45:34

标签: python list

我对编码非常陌生,我正在做一个作业,我必须在一个巨大的列表中查找所有偶数索引整数的乘积:

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

该问题建议使用range(len(list)),它给我的范围是(1,50),但我看不出它的相关性。我设法不使用该方法就得到了答案:

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

result = 1
evenlist = number_list[::2]
for num in evenlist:
    result = result * num

range(len(list))在这里有用吗?

5 个答案:

答案 0 :(得分:4)

可能是这样的,您可以在其中使用数组的索引来引用它;

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

result = 1
for idx in range(0, len(number_list), 2):
   result = result * number_list[idx]

答案 1 :(得分:1)

我要补充一点,@ fixatd的答案是正确的,但同时也提醒您该解决方案不是Pythonic。我意识到您的书/讲师希望以某种方式给出答案,但是我想详细说明一下,并为您提供一些更好的替代方法,以解决您不依赖于他们希望看到的解决方案的问题。

例如,这将是一种更具功能性的解决方案:

from operator import mul
from itertools import islice
from functools import reduce
number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]
reduce(mul, islice(number_list, 0, None, 2))
218032559868925537961630414929920000

或者,如果您喜欢较少的导入或较少的功能,则可以像本机一样循环。在python中,您通常只会遍历可迭代对象。这个成语是

for something in iterable:  

使用len在范围内的某物只是迭代地遍历某物通常不那么pythonic。如果由于某种原因确实需要索引,请使用enumerate:

for index, item in enumerate(iterable):

您提供的解决方案实际上是非常好的Python风格的,与工作分配的要求相反。这是您的解决方案,需要稍作清理:

result = 1
for num in number_list[::2]:
    result *= num

>>>result
218032559868925537961630414929920000

答案 2 :(得分:0)

为什么对使用范围感兴趣?下面有两个其他变体可以解决您的问题。

第一种方式:

result = 1
for numbers in number_list:
    result *= numbers

第二种方式:

from functools import reduce
reduce(lambda a, b: a*b, number_list)

答案 3 :(得分:0)

好吧,除了@fixatd的答案,您还可以使用reduce来做到这一点:

import operator
from functools import reduce

def prod(iterable):
    return reduce(operator.mul, iterable, 1)

result = prod(evenlist)

答案 4 :(得分:-1)

您可以做的是遍历数组,但是可以将每次迭代的“跳转”指定为两次,而不是使用range(start,end,jump)一次。在进行list[::2]时,您正在做的事情是创建一个新数组并删除所有其他元素,然后对其进行迭代。小心,因为可能需要更多的资源来进行较大的输入。

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

prod = 1
for i in range(0, len(number_list), 2):
    prod *= list[i]